Move RtpExtension to api/ directory and config.h/.cc to call/.

BUG=webrtc:5876
R=deadbeef@webrtc.org, solenberg@webrtc.org

Review-Url: https://codereview.webrtc.org/3004723002 .
Cr-Original-Commit-Position: refs/heads/master@{#19639}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 1acbd68718476b2754a7872fb72e3a8a74166eb9
diff --git a/BUILD.gn b/BUILD.gn
index b5c832d..4216bd3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -347,7 +347,6 @@
   sources = [
     "common_types.cc",
     "common_types.h",
-    "config.cc",
     "config.h",
     "typedefs.h",
   ]
@@ -384,9 +383,6 @@
 
   rtc_test("rtc_unittests") {
     testonly = true
-    sources = [
-      "config_unittest.cc",
-    ]
 
     deps = [
       ":webrtc_common",
diff --git a/DEPS b/DEPS
index 276991d..0459f4c 100644
--- a/DEPS
+++ b/DEPS
@@ -9,8 +9,8 @@
   "+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/config.h",
   "+webrtc/transport.h",
   "+webrtc/typedefs.h",
   "+webrtc/voice_engine_configurations.h",
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 3d19f03..e58f393 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -62,6 +62,7 @@
     "proxy.h",
     "rtcerror.cc",
     "rtcerror.h",
+    "rtpparameters.cc",
     "rtpparameters.h",
     "rtpreceiverinterface.h",
     "rtpsender.h",
@@ -258,6 +259,7 @@
       "ortc/mediadescription_unittest.cc",
       "ortc/sessiondescription_unittest.cc",
       "rtcerror_unittest.cc",
+      "rtpparameters_unittest.cc",
     ]
 
     if (!build_with_chromium && is_clang) {
diff --git a/api/rtpparameters.cc b/api/rtpparameters.cc
new file mode 100644
index 0000000..29b14fb
--- /dev/null
+++ b/api/rtpparameters.cc
@@ -0,0 +1,190 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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
index 94d9d73..46f7139 100644
--- a/api/rtpparameters.h
+++ b/api/rtpparameters.h
@@ -16,7 +16,6 @@
 #include <vector>
 
 #include "webrtc/api/mediatypes.h"
-#include "webrtc/config.h"
 #include "webrtc/rtc_base/optional.h"
 
 namespace webrtc {
@@ -85,10 +84,10 @@
   rtc::Optional<RtcpFeedbackMessageType> message_type;
 
   // Constructors for convenience.
-  RtcpFeedback() {}
-  explicit RtcpFeedback(RtcpFeedbackType type) : type(type) {}
-  RtcpFeedback(RtcpFeedbackType type, RtcpFeedbackMessageType message_type)
-      : type(type), message_type(message_type) {}
+  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;
@@ -100,6 +99,9 @@
 // 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; }
 
@@ -196,10 +198,10 @@
   bool preferred_encrypt = false;
 
   // Constructors for convenience.
-  RtpHeaderExtensionCapability() = default;
-  explicit RtpHeaderExtensionCapability(const std::string& uri) : uri(uri) {}
-  RtpHeaderExtensionCapability(const std::string& uri, int preferred_id)
-      : uri(uri), preferred_id(preferred_id) {}
+  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 &&
@@ -210,6 +212,83 @@
   }
 };
 
+// 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;
+};
+
 // See webrtc/config.h. Has "uri" and "id" fields.
 // TODO(deadbeef): This is missing the "encrypt" flag, which is unimplemented.
 typedef RtpExtension RtpHeaderExtensionParameters;
@@ -222,10 +301,10 @@
   FecMechanism mechanism = FecMechanism::RED;
 
   // Constructors for convenience.
-  RtpFecParameters() = default;
-  explicit RtpFecParameters(FecMechanism mechanism) : mechanism(mechanism) {}
-  RtpFecParameters(FecMechanism mechanism, uint32_t ssrc)
-      : ssrc(ssrc), mechanism(mechanism) {}
+  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;
@@ -239,14 +318,18 @@
   rtc::Optional<uint32_t> ssrc;
 
   // Constructors for convenience.
-  RtpRtxParameters() = default;
-  explicit RtpRtxParameters(uint32_t ssrc) : ssrc(ssrc) {}
+  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
@@ -338,6 +421,9 @@
 };
 
 struct RtpCodecParameters {
+  RtpCodecParameters();
+  ~RtpCodecParameters();
+
   // Build MIME "type/subtype" string from |name| and |kind|.
   std::string mime_type() const { return MediaTypeToString(kind) + "/" + name; }
 
@@ -400,6 +486,9 @@
 // endpoint. An application can use these capabilities to construct an
 // RtpParameters.
 struct RtpCapabilities {
+  RtpCapabilities();
+  ~RtpCapabilities();
+
   // Supported codecs.
   std::vector<RtpCodecCapability> codecs;
 
@@ -422,6 +511,9 @@
 // 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.
diff --git a/config_unittest.cc b/api/rtpparameters_unittest.cc
similarity index 92%
rename from config_unittest.cc
rename to api/rtpparameters_unittest.cc
index 03784d4..6cb90c2 100644
--- a/config_unittest.cc
+++ b/api/rtpparameters_unittest.cc
@@ -8,11 +8,12 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "webrtc/config.h"
+#include <utility>
 
-#include <vector>
+#include "webrtc/api/rtpparameters.h"
+#include "webrtc/test/gtest.h"
 
-#include "webrtc/rtc_base/gunit.h"
+namespace webrtc {
 
 using webrtc::RtpExtension;
 
@@ -47,3 +48,4 @@
   EXPECT_EQ(2u, filtered.size());
   EXPECT_EQ(extensions, filtered);
 }
+}  // namespace webrtc
diff --git a/call/BUILD.gn b/call/BUILD.gn
index d86df1e..263f16d 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -38,6 +38,8 @@
 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",
@@ -100,6 +102,7 @@
   public_deps = [
     ":call_interfaces",
     "../api:call_api",
+    "../api:libjingle_peerconnection_api",
   ]
 
   deps = [
@@ -107,6 +110,7 @@
     ":rtp_interfaces",
     ":rtp_receiver",
     ":rtp_sender",
+    ":video_stream_api",
     "..:webrtc_common",
     "../api:transport_api",
     "../audio",
@@ -127,13 +131,17 @@
 
 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:transport_api",
     "../common_video:common_video",
     "../rtc_base:rtc_base_approved",
@@ -209,6 +217,7 @@
     ]
     deps = [
       ":call_interfaces",
+      ":video_stream_api",
       "..:webrtc_common",
       "../api/audio_codecs:builtin_audio_encoder_factory",
       "../logging:rtc_event_log_api",
diff --git a/call/audio_receive_stream.h b/call/audio_receive_stream.h
index fdf1698..018ad35 100644
--- a/call/audio_receive_stream.h
+++ b/call/audio_receive_stream.h
@@ -18,9 +18,10 @@
 
 #include "webrtc/api/audio_codecs/audio_decoder_factory.h"
 #include "webrtc/api/call/transport.h"
+#include "webrtc/api/rtpparameters.h"
 #include "webrtc/api/rtpreceiverinterface.h"
+#include "webrtc/call/rtp_config.h"
 #include "webrtc/common_types.h"
-#include "webrtc/config.h"
 #include "webrtc/rtc_base/optional.h"
 #include "webrtc/rtc_base/scoped_ref_ptr.h"
 #include "webrtc/typedefs.h"
diff --git a/call/audio_send_stream.h b/call/audio_send_stream.h
index fa5b5ee..8720249 100644
--- a/call/audio_send_stream.h
+++ b/call/audio_send_stream.h
@@ -18,8 +18,10 @@
 #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/config.h"
+#include "webrtc/api/rtpparameters.h"
+#include "webrtc/call/rtp_config.h"
 #include "webrtc/rtc_base/optional.h"
+#include "webrtc/rtc_base/scoped_ref_ptr.h"
 #include "webrtc/typedefs.h"
 
 namespace webrtc {
diff --git a/call/call.cc b/call/call.cc
index b1f56d3..edb9bf3 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -26,7 +26,6 @@
 #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/config.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"
diff --git a/call/call_perf_tests.cc b/call/call_perf_tests.cc
index 530ad29..29dd0e4 100644
--- a/call/call_perf_tests.cc
+++ b/call/call_perf_tests.cc
@@ -15,7 +15,7 @@
 
 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
 #include "webrtc/call/call.h"
-#include "webrtc/config.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"
diff --git a/call/flexfec_receive_stream.h b/call/flexfec_receive_stream.h
index 84447ff..400bca4 100644
--- a/call/flexfec_receive_stream.h
+++ b/call/flexfec_receive_stream.h
@@ -17,8 +17,9 @@
 #include <vector>
 
 #include "webrtc/api/call/transport.h"
+#include "webrtc/api/rtpparameters.h"
 #include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/config.h"
+#include "webrtc/common_types.h"
 
 namespace webrtc {
 
diff --git a/call/rtp_config.cc b/call/rtp_config.cc
new file mode 100644
index 0000000..dc3ea21
--- /dev/null
+++ b/call/rtp_config.cc
@@ -0,0 +1,38 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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
new file mode 100644
index 0000000..f33103d
--- /dev/null
+++ b/call/rtp_config.h
@@ -0,0 +1,48 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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/video_config.cc b/call/video_config.cc
new file mode 100644
index 0000000..e06d5e8
--- /dev/null
+++ b/call/video_config.cc
@@ -0,0 +1,139 @@
+/*
+ *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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
new file mode 100644
index 0000000..cdff513
--- /dev/null
+++ b/call/video_config.h
@@ -0,0 +1,157 @@
+/*
+ *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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/common_types.h"
+#include "webrtc/rtc_base/basictypes.h"
+#include "webrtc/rtc_base/optional.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.h b/call/video_receive_stream.h
index 18e904d..8ed93a1 100644
--- a/call/video_receive_stream.h
+++ b/call/video_receive_stream.h
@@ -17,9 +17,10 @@
 #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/config.h"
 #include "webrtc/media/base/videosinkinterface.h"
 #include "webrtc/rtc_base/platform_file.h"
 
diff --git a/call/video_send_stream.h b/call/video_send_stream.h
index a176709..a458203 100644
--- a/call/video_send_stream.h
+++ b/call/video_send_stream.h
@@ -17,9 +17,11 @@
 #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/config.h"
 #include "webrtc/media/base/videosinkinterface.h"
 #include "webrtc/media/base/videosourceinterface.h"
 #include "webrtc/rtc_base/platform_file.h"
diff --git a/config.cc b/config.cc
deleted file mode 100644
index 19a9a96..0000000
--- a/config.cc
+++ /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 "webrtc/config.h"
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-
-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;
-}
-
-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;
-}
-
-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/config.h b/config.h
index 962e0f2..46c1f42 100644
--- a/config.h
+++ b/config.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -8,259 +8,12 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-// TODO(pbos): Move Config from common.h to here.
-
 #ifndef WEBRTC_CONFIG_H_
 #define WEBRTC_CONFIG_H_
 
-#include <string>
-#include <vector>
+// TODO(holmer): Delete this file once downstream projects have been updated.
 
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/optional.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-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;
-};
-
-// RTP header extension, see RFC 5285.
-struct RtpExtension {
-  RtpExtension() {}
-  RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
-  RtpExtension(const std::string& uri, int id, bool encrypt) : uri(uri),
-      id(id), encrypt(encrypt) {}
-  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;
-};
-
-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
+#include "webrtc/api/rtpparameters.h"
+#include "webrtc/call/rtp_config.h"
 
 #endif  // WEBRTC_CONFIG_H_
diff --git a/logging/BUILD.gn b/logging/BUILD.gn
index 8f1e493..6b1e549 100644
--- a/logging/BUILD.gn
+++ b/logging/BUILD.gn
@@ -29,6 +29,7 @@
   ]
   deps = [
     "..:webrtc_common",
+    "../api:libjingle_peerconnection_api",
     "../call:video_stream_api",
     "../rtc_base:rtc_base_approved",
   ]
@@ -159,6 +160,7 @@
         ":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.
diff --git a/logging/rtc_event_log/rtc_event_log.h b/logging/rtc_event_log/rtc_event_log.h
index dc33511..d26dccb 100644
--- a/logging/rtc_event_log/rtc_event_log.h
+++ b/logging/rtc_event_log/rtc_event_log.h
@@ -15,7 +15,8 @@
 #include <string>
 #include <vector>
 
-#include "webrtc/config.h"
+#include "webrtc/api/rtpparameters.h"
+#include "webrtc/common_types.h"
 #include "webrtc/rtc_base/platform_file.h"
 
 namespace webrtc {
diff --git a/logging/rtc_event_log/rtc_event_log2text.cc b/logging/rtc_event_log/rtc_event_log2text.cc
index 3f03108..bba6ace 100644
--- a/logging/rtc_event_log/rtc_event_log2text.cc
+++ b/logging/rtc_event_log/rtc_event_log2text.cc
@@ -16,8 +16,8 @@
 #include <string>
 #include <utility>  // pair
 
+#include "webrtc/call/video_config.h"
 #include "webrtc/common_types.h"
-#include "webrtc/config.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"
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h
index 99ed291..1ab4123 100644
--- a/media/base/mediachannel.h
+++ b/media/base/mediachannel.h
@@ -18,7 +18,7 @@
 #include "webrtc/api/rtpparameters.h"
 #include "webrtc/api/rtpreceiverinterface.h"
 #include "webrtc/api/video/video_timing.h"
-#include "webrtc/config.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"
diff --git a/media/engine/simulcast.h b/media/engine/simulcast.h
index 4531bcc..81668e4 100644
--- a/media/engine/simulcast.h
+++ b/media/engine/simulcast.h
@@ -13,7 +13,7 @@
 
 #include <vector>
 
-#include "webrtc/config.h"
+#include "webrtc/call/video_config.h"
 #include "webrtc/rtc_base/basictypes.h"
 
 namespace cricket {
diff --git a/media/engine/webrtcmediaengine.h b/media/engine/webrtcmediaengine.h
index edbda66..8740917 100644
--- a/media/engine/webrtcmediaengine.h
+++ b/media/engine/webrtcmediaengine.h
@@ -15,7 +15,6 @@
 #include <vector>
 
 #include "webrtc/call/call.h"
-#include "webrtc/config.h"
 #include "webrtc/media/base/mediaengine.h"
 
 namespace webrtc {
diff --git a/media/engine/webrtcvoiceengine.h b/media/engine/webrtcvoiceengine.h
index f938446..a42459a 100644
--- a/media/engine/webrtcvoiceengine.h
+++ b/media/engine/webrtcvoiceengine.h
@@ -20,7 +20,6 @@
 #include "webrtc/api/rtpreceiverinterface.h"
 #include "webrtc/call/audio_state.h"
 #include "webrtc/call/call.h"
-#include "webrtc/config.h"
 #include "webrtc/media/base/rtputils.h"
 #include "webrtc/media/engine/apm_helpers.h"
 #include "webrtc/media/engine/webrtccommon.h"
diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn
index 50819f1..569d214 100644
--- a/modules/audio_coding/BUILD.gn
+++ b/modules/audio_coding/BUILD.gn
@@ -1569,8 +1569,11 @@
       ":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",
@@ -1702,6 +1705,8 @@
       "../..:webrtc_common",
       "../../common_audio",
       "../../rtc_base:rtc_base_approved",
+      "../../system_wrappers:metrics_default",
+      "../../test:field_trial",
     ]
 
     configs += [ ":RTPencode_config" ]
diff --git a/modules/audio_processing/audio_processing_impl_locking_unittest.cc b/modules/audio_processing/audio_processing_impl_locking_unittest.cc
index db2aacb..f8707c3 100644
--- a/modules/audio_processing/audio_processing_impl_locking_unittest.cc
+++ b/modules/audio_processing/audio_processing_impl_locking_unittest.cc
@@ -14,7 +14,6 @@
 #include <memory>
 #include <vector>
 
-#include "webrtc/config.h"
 #include "webrtc/modules/audio_processing/test/test_utils.h"
 #include "webrtc/modules/include/module_common_types.h"
 #include "webrtc/rtc_base/array_view.h"
diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc
index 75e5aab..e49b632 100644
--- a/modules/audio_processing/audio_processing_impl_unittest.cc
+++ b/modules/audio_processing/audio_processing_impl_unittest.cc
@@ -10,7 +10,6 @@
 
 #include "webrtc/modules/audio_processing/audio_processing_impl.h"
 
-#include "webrtc/config.h"
 #include "webrtc/modules/audio_processing/test/test_utils.h"
 #include "webrtc/modules/include/module_common_types.h"
 #include "webrtc/test/gmock.h"
diff --git a/modules/audio_processing/audio_processing_performance_unittest.cc b/modules/audio_processing/audio_processing_performance_unittest.cc
index 6d0a61b..e478c72 100644
--- a/modules/audio_processing/audio_processing_performance_unittest.cc
+++ b/modules/audio_processing/audio_processing_performance_unittest.cc
@@ -15,7 +15,6 @@
 #include <memory>
 #include <vector>
 
-#include "webrtc/config.h"
 #include "webrtc/modules/audio_processing/test/test_utils.h"
 #include "webrtc/modules/include/module_common_types.h"
 #include "webrtc/rtc_base/array_view.h"
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index 775ebcb..07ac7ae 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -341,6 +341,7 @@
       ":rtp_rtcp",
       "..:module_api",
       "../..:webrtc_common",
+      "../../api:libjingle_peerconnection_api",
       "../../api:transport_api",
       "../../common_video:common_video",
       "../../rtc_base:rtc_base_approved",
diff --git a/modules/rtp_rtcp/include/flexfec_sender.h b/modules/rtp_rtcp/include/flexfec_sender.h
index 3bcd2eb..82a01cc 100644
--- a/modules/rtp_rtcp/include/flexfec_sender.h
+++ b/modules/rtp_rtcp/include/flexfec_sender.h
@@ -14,7 +14,7 @@
 #include <memory>
 #include <vector>
 
-#include "webrtc/config.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"
diff --git a/modules/rtp_rtcp/include/rtp_header_extension_map.h b/modules/rtp_rtcp/include/rtp_header_extension_map.h
index 98bc9ec..93cbd10 100644
--- a/modules/rtp_rtcp/include/rtp_header_extension_map.h
+++ b/modules/rtp_rtcp/include/rtp_header_extension_map.h
@@ -13,7 +13,7 @@
 
 #include <string>
 
-#include "webrtc/config.h"
+#include "webrtc/api/rtpparameters.h"
 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "webrtc/rtc_base/array_view.h"
 #include "webrtc/rtc_base/basictypes.h"
diff --git a/modules/rtp_rtcp/source/flexfec_sender_unittest.cc b/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
index 7c26b80..da33837 100644
--- a/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
@@ -10,7 +10,7 @@
 
 #include <vector>
 
-#include "webrtc/config.h"
+#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"
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 790319a..31d1b0e 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -16,8 +16,8 @@
 #include <set>
 #include <string>
 
+#include "webrtc/api/rtpparameters.h"
 #include "webrtc/common_types.h"
-#include "webrtc/config.h"
 #include "webrtc/rtc_base/checks.h"
 #include "webrtc/rtc_base/logging.h"
 
diff --git a/pc/webrtcsdp.cc b/pc/webrtcsdp.cc
index e514fe7..7dc2605 100644
--- a/pc/webrtcsdp.cc
+++ b/pc/webrtcsdp.cc
@@ -22,13 +22,8 @@
 
 #include "webrtc/api/jsepicecandidate.h"
 #include "webrtc/api/jsepsessiondescription.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"
 // for RtpExtension
-#include "webrtc/config.h"
+#include "webrtc/api/rtpparameters.h"
 #include "webrtc/media/base/codec.h"
 #include "webrtc/media/base/cryptoparams.h"
 #include "webrtc/media/base/mediaconstants.h"
@@ -38,6 +33,11 @@
 #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;
diff --git a/test/call_test.cc b/test/call_test.cc
index 3efc022..b5d7236 100644
--- a/test/call_test.cc
+++ b/test/call_test.cc
@@ -15,7 +15,7 @@
 #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/config.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"
diff --git a/video/payload_router.h b/video/payload_router.h
index 8b51861..bfd4b8e 100644
--- a/video/payload_router.h
+++ b/video/payload_router.h
@@ -15,7 +15,6 @@
 
 #include "webrtc/api/video_codecs/video_encoder.h"
 #include "webrtc/common_types.h"
-#include "webrtc/config.h"
 #include "webrtc/rtc_base/constructormagic.h"
 #include "webrtc/rtc_base/criticalsection.h"
 #include "webrtc/rtc_base/thread_annotations.h"
diff --git a/video/payload_router_unittest.cc b/video/payload_router_unittest.cc
index 9f58ceb..2293a24 100644
--- a/video/payload_router_unittest.cc
+++ b/video/payload_router_unittest.cc
@@ -10,6 +10,7 @@
 
 #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"
diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc
index 4678b8f..0dbb2f7 100644
--- a/video/rtp_video_stream_receiver.cc
+++ b/video/rtp_video_stream_receiver.cc
@@ -14,8 +14,8 @@
 #include <utility>
 #include <vector>
 
+#include "webrtc/call/video_config.h"
 #include "webrtc/common_types.h"
-#include "webrtc/config.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"
diff --git a/voice_engine/channel.cc b/voice_engine/channel.cc
index 901d80c..039d935 100644
--- a/voice_engine/channel.cc
+++ b/voice_engine/channel.cc
@@ -15,7 +15,6 @@
 
 #include "webrtc/audio/utility/audio_frame_operations.h"
 #include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/config.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"