Reland of Stop using hardcoded payload types for video codecs (patchset #1 id:1 of https://codereview.webrtc.org/2513633002/ )

Reason for revert:
The WebRtcBrowserTest.NegotiateUnsupportedVideoCodec test has been fixed in Chromium with the following change:
   function removeVideoCodec(offerSdp) {
-    offerSdp = offerSdp.replace('a=rtpmap:100 VP8/90000\r\n',
-                                'a=rtpmap:100 XVP8/90000\r\n');
+    offerSdp = offerSdp.replace(/a=rtpmap:(\d+)\ VP8\/90000\r\n/,
+                                'a=rtpmap:$1 XVP8/90000\r\n');
     return offerSdp;
   }

Original issue's description:
> Revert of Stop using hardcoded payload types for video codecs (patchset #6 id:210001 of https://codereview.webrtc.org/2493133002/ )
>
> Reason for revert:
> Breaks chromium.fyi test:
> WebRtcBrowserTest.NegotiateUnsupportedVideoCodec
>
> Original issue's description:
> > Stop using hardcoded payload types for video codecs
> >
> > This CL stops using hardcoded payload types for different video codecs
> > and will dynamically assign them payload types incrementally from 96 to
> > 127 instead.
> >
> > This CL:
> >  * Replaces 'std::vector<VideoCodec> DefaultVideoCodecList()' in
> >    webrtcvideoengine2.cc with an explicit WebRtcVideoEncoderFactory for
> >    internally supported software codecs instead. The purpose is to
> >    streamline the payload type assignment in webrtcvideoengine2.cc which
> >    will now have two encoder factories of the same
> >    WebRtcVideoEncoderFactory type; one internal and one external.
> >  * Removes webrtc::VideoEncoder::EncoderType and use cricket::VideoCodec
> >    instead.
> >  * Removes 'static VideoEncoder* Create(EncoderType codec_type)' and
> >    moves the create function to the internal encoder factory instead.
> >  * Removes video_encoder.cc. webrtc::VideoEncoder is now just an
> >    interface without any static functions.
> >  * The function GetSupportedCodecs in webrtcvideoengine2.cc unifies
> >    the internal and external codecs and assigns them payload types
> >    incrementally from 96 to 127.
> >  * Updates webrtcvideoengine2_unittest.cc and removes assumptions about
> >    what payload types will be used.
> >
> > BUG=webrtc:6677,webrtc:6705
> > R=hta@webrtc.org, ossu@webrtc.org, stefan@webrtc.org
> >
> > Committed: https://crrev.com/42043b95872b51321f508bf255d804ce3dff366b
> > Cr-Commit-Position: refs/heads/master@{#15135}
>
> TBR=hta@webrtc.org,stefan@webrtc.org,ossu@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:6677,webrtc:6705
>
> Committed: https://crrev.com/eacbaea920797ff751ca83050d140821f5055591
> Cr-Commit-Position: refs/heads/master@{#15140}

TBR=hta@webrtc.org,stefan@webrtc.org,ossu@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:6677,webrtc:6705

Review-Url: https://codereview.webrtc.org/2511933002
Cr-Commit-Position: refs/heads/master@{#15148}
diff --git a/webrtc/api/android/jni/androidmediaencoder_jni.cc b/webrtc/api/android/jni/androidmediaencoder_jni.cc
index 6fcb0fb..d5998c0 100644
--- a/webrtc/api/android/jni/androidmediaencoder_jni.cc
+++ b/webrtc/api/android/jni/androidmediaencoder_jni.cc
@@ -30,6 +30,7 @@
 #include "webrtc/base/timeutils.h"
 #include "webrtc/common_types.h"
 #include "webrtc/common_video/h264/h264_bitstream_parser.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"
@@ -96,7 +97,7 @@
  public:
   virtual ~MediaCodecVideoEncoder();
   MediaCodecVideoEncoder(JNIEnv* jni,
-                         VideoCodecType codecType,
+                         const cricket::VideoCodec& codec,
                          jobject egl_context);
 
   // webrtc::VideoEncoder implementation.  Everything trampolines to
@@ -186,7 +187,7 @@
   void LogStatistics(bool force_log);
 
   // Type of video codec.
-  VideoCodecType codecType_;
+  const cricket::VideoCodec codec_;
 
   // Valid all the time since RegisterEncodeCompleteCallback() Invoke()s to
   // |codec_thread_| synchronously.
@@ -302,9 +303,9 @@
 }
 
 MediaCodecVideoEncoder::MediaCodecVideoEncoder(JNIEnv* jni,
-                                               VideoCodecType codecType,
+                                               const cricket::VideoCodec& codec,
                                                jobject egl_context)
-    : codecType_(codecType),
+    : codec_(codec),
       callback_(NULL),
       codec_thread_(new Thread()),
       j_media_codec_video_encoder_class_(
@@ -392,9 +393,10 @@
     return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
   }
   // Factory should guard against other codecs being used with us.
-  RTC_CHECK(codec_settings->codecType == codecType_)
+  const VideoCodecType codec_type = cricket::CodecTypeFromName(codec_.name);
+  RTC_CHECK(codec_settings->codecType == codec_type)
       << "Unsupported codec " << codec_settings->codecType << " for "
-      << codecType_;
+      << codec_type;
   if (sw_fallback_required_) {
     return WEBRTC_VIDEO_CODEC_OK;
   }
@@ -404,9 +406,9 @@
   // Scaling is disabled for VP9, but optionally enabled for VP8.
   // TODO(pbos): Extract automaticResizeOn out of VP8 settings.
   scale_ = false;
-  if (codecType_ == kVideoCodecVP8) {
+  if (codec_type == kVideoCodecVP8) {
     scale_ = codec_settings->VP8().automaticResizeOn;
-  } else if (codecType_ != kVideoCodecVP9) {
+  } else if (codec_type != kVideoCodecVP9) {
     scale_ = true;
   }
 
@@ -414,8 +416,8 @@
   ALOGD << "Encoder automatic resize " << (scale_ ? "enabled" : "disabled");
 
   if (scale_) {
-    if (codecType_ == kVideoCodecVP8 || codecType_ == kVideoCodecH264) {
-      quality_scaler_.Init(codecType_, codec_settings->startBitrate,
+    if (codec_type == kVideoCodecVP8 || codec_type == kVideoCodecH264) {
+      quality_scaler_.Init(codec_type, codec_settings->startBitrate,
                            codec_settings->width, codec_settings->height,
                            codec_settings->maxFramerate);
     } else {
@@ -522,8 +524,8 @@
 bool MediaCodecVideoEncoder::ProcessHWErrorOnCodecThread(
     bool reset_if_fallback_unavailable) {
   ALOGE << "ProcessHWErrorOnCodecThread";
-  if (VideoEncoder::IsSupportedSoftware(
-          VideoEncoder::CodecToEncoderType(codecType_))) {
+  if (FindMatchingCodec(cricket::InternalEncoderFactory().supported_codecs(),
+                        codec_)) {
     ALOGE << "Fallback to SW encoder.";
     sw_fallback_required_ = true;
     return false;
@@ -550,9 +552,9 @@
   JNIEnv* jni = AttachCurrentThreadIfNeeded();
   ScopedLocalRefFrame local_ref_frame(jni);
 
-  ALOGD << "InitEncodeOnCodecThread Type: " <<  (int)codecType_ << ", " <<
-      width << " x " << height << ". Bitrate: " << kbps <<
-      " kbps. Fps: " << fps;
+  const VideoCodecType codec_type = cricket::CodecTypeFromName(codec_.name);
+  ALOGD << "InitEncodeOnCodecThread Type: " << (int)codec_type << ", " << width
+        << " x " << height << ". Bitrate: " << kbps << " kbps. Fps: " << fps;
   if (kbps == 0) {
     kbps = last_set_bitrate_kbps_;
   }
@@ -591,7 +593,7 @@
 
   // We enforce no extra stride/padding in the format creation step.
   jobject j_video_codec_enum = JavaEnumFromIndexAndClassName(
-      jni, "MediaCodecVideoEncoder$VideoCodecType", codecType_);
+      jni, "MediaCodecVideoEncoder$VideoCodecType", codec_type);
   const bool encode_status = jni->CallBooleanMethod(
       *j_media_codec_video_encoder_, j_init_encode_method_,
       j_video_codec_enum, width, height, kbps, fps,
@@ -1065,6 +1067,7 @@
     }
 
     // Callback - return encoded frame.
+    const VideoCodecType codec_type = cricket::CodecTypeFromName(codec_.name);
     webrtc::EncodedImageCallback::Result callback_result(
         webrtc::EncodedImageCallback::Result::OK);
     if (callback_) {
@@ -1083,8 +1086,8 @@
 
       webrtc::CodecSpecificInfo info;
       memset(&info, 0, sizeof(info));
-      info.codecType = codecType_;
-      if (codecType_ == kVideoCodecVP8) {
+      info.codecType = codec_type;
+      if (codec_type == kVideoCodecVP8) {
         info.codecSpecific.VP8.pictureId = picture_id_;
         info.codecSpecific.VP8.nonReference = false;
         info.codecSpecific.VP8.simulcastIdx = 0;
@@ -1092,7 +1095,7 @@
         info.codecSpecific.VP8.layerSync = false;
         info.codecSpecific.VP8.tl0PicIdx = webrtc::kNoTl0PicIdx;
         info.codecSpecific.VP8.keyIdx = webrtc::kNoKeyIdx;
-      } else if (codecType_ == kVideoCodecVP9) {
+      } else if (codec_type == kVideoCodecVP9) {
         if (key_frame) {
           gof_idx_ = 0;
         }
@@ -1121,13 +1124,13 @@
       // Generate a header describing a single fragment.
       webrtc::RTPFragmentationHeader header;
       memset(&header, 0, sizeof(header));
-      if (codecType_ == kVideoCodecVP8 || codecType_ == kVideoCodecVP9) {
+      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 (codecType_ == kVideoCodecVP8 && scale_) {
+        if (codec_type == kVideoCodecVP8 && scale_) {
           int qp;
           if (webrtc::vp8::GetQp(payload, payload_size, &qp)) {
             current_acc_qp_ += qp;
@@ -1135,7 +1138,7 @@
             image->qp_ = qp;
           }
         }
-      } else if (codecType_ == kVideoCodecH264) {
+      } else if (codec_type == kVideoCodecH264) {
         if (scale_) {
           h264_bitstream_parser_.ParseBitstream(payload, payload_size);
           int qp;
@@ -1359,8 +1362,7 @@
   }
   if (FindMatchingCodec(supported_codecs_, codec)) {
     ALOGD << "Create HW video encoder for " << codec.name;
-    const VideoCodecType type = cricket::CodecTypeFromName(codec.name);
-    return new MediaCodecVideoEncoder(AttachCurrentThreadIfNeeded(), type,
+    return new MediaCodecVideoEncoder(AttachCurrentThreadIfNeeded(), codec,
                                       egl_context_);
   }
   ALOGW << "Can not find HW video encoder for type " << codec.name;
diff --git a/webrtc/api/webrtcsdp_unittest.cc b/webrtc/api/webrtcsdp_unittest.cc
index 3c6643f..7941323 100644
--- a/webrtc/api/webrtcsdp_unittest.cc
+++ b/webrtc/api/webrtcsdp_unittest.cc
@@ -2083,11 +2083,12 @@
 }
 
 TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithH264) {
-  if (!webrtc::H264Encoder::IsSupported())
-    return;
-  for (const auto& codec : cricket::DefaultVideoCodecList()) {
-    video_desc_->AddCodec(codec);
-  }
+  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);
diff --git a/webrtc/media/BUILD.gn b/webrtc/media/BUILD.gn
index c3d173a..590450b 100644
--- a/webrtc/media/BUILD.gn
+++ b/webrtc/media/BUILD.gn
@@ -81,6 +81,8 @@
     "base/videoframe.h",
     "base/videosourcebase.cc",
     "base/videosourcebase.h",
+    "engine/internalencoderfactory.cc",
+    "engine/internalencoderfactory.h",
     "engine/nullwebrtcvideoengine.h",
     "engine/payload_type_mapper.cc",
     "engine/payload_type_mapper.h",
diff --git a/webrtc/media/base/mediaconstants.cc b/webrtc/media/base/mediaconstants.cc
index 5acd8cd..bce2521 100644
--- a/webrtc/media/base/mediaconstants.cc
+++ b/webrtc/media/base/mediaconstants.cc
@@ -108,17 +108,5 @@
 const char kH264FmtpPacketizationMode[] = "packetization-mode";
 const char kH264ProfileLevelConstrainedBaseline[] = "42e01f";
 
-const int kDefaultVp8PlType = 100;
-const int kDefaultVp9PlType = 101;
-const int kDefaultH264PlType = 107;
-const int kDefaultRedPlType = 116;
-const int kDefaultUlpfecType = 117;
-const int kDefaultFlexfecPlType = 118;
-const int kDefaultRtxVp8PlType = 96;
-const int kDefaultRtxVp9PlType = 97;
-const int kDefaultRtxRedPlType = 98;
-const int kDefaultRtxH264ConstrainedBaselinePlType = 99;
-const int kDefaultRtxH264ConstrainedHighPlType = 102;
-
 const int kDefaultVideoMaxFramerate = 60;
 }  // namespace cricket
diff --git a/webrtc/media/base/mediaconstants.h b/webrtc/media/base/mediaconstants.h
index 02a7ba2..70080c3 100644
--- a/webrtc/media/base/mediaconstants.h
+++ b/webrtc/media/base/mediaconstants.h
@@ -130,18 +130,6 @@
 extern const char kH264FmtpPacketizationMode[];
 extern const char kH264ProfileLevelConstrainedBaseline[];
 
-extern const int kDefaultVp8PlType;
-extern const int kDefaultVp9PlType;
-extern const int kDefaultH264PlType;
-extern const int kDefaultRedPlType;
-extern const int kDefaultUlpfecType;
-extern const int kDefaultFlexfecPlType;
-extern const int kDefaultRtxVp8PlType;
-extern const int kDefaultRtxVp9PlType;
-extern const int kDefaultRtxRedPlType;
-extern const int kDefaultRtxH264ConstrainedBaselinePlType;
-extern const int kDefaultRtxH264ConstrainedHighPlType;
-
 extern const int kDefaultVideoMaxFramerate;
 }  // namespace cricket
 
diff --git a/webrtc/media/engine/internalencoderfactory.cc b/webrtc/media/engine/internalencoderfactory.cc
new file mode 100644
index 0000000..4c98015
--- /dev/null
+++ b/webrtc/media/engine/internalencoderfactory.cc
@@ -0,0 +1,68 @@
+/*
+ *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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"
+
+namespace cricket {
+
+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.
+    // TODO(hta): Set FMTP parameters for all codecs of type H264.
+    codec.SetParam(kH264FmtpProfileLevelId,
+                   kH264ProfileLevelConstrainedBaseline);
+    codec.SetParam(kH264FmtpLevelAsymmetryAllowed, "1");
+    codec.SetParam(kH264FmtpPacketizationMode, "1");
+    supported_codecs_.push_back(std::move(codec));
+  }
+
+  supported_codecs_.push_back(cricket::VideoCodec(kRedCodecName));
+  supported_codecs_.push_back(cricket::VideoCodec(kUlpfecCodecName));
+}
+
+InternalEncoderFactory::~InternalEncoderFactory() {}
+
+// WebRtcVideoEncoderFactory implementation.
+webrtc::VideoEncoder* InternalEncoderFactory::CreateVideoEncoder(
+    const cricket::VideoCodec& codec) {
+  switch (CodecTypeFromName(codec.name)) {
+    case webrtc::kVideoCodecH264:
+      return webrtc::H264Encoder::Create();
+    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/webrtc/media/engine/internalencoderfactory.h b/webrtc/media/engine/internalencoderfactory.h
new file mode 100644
index 0000000..909fa0f
--- /dev/null
+++ b/webrtc/media/engine/internalencoderfactory.h
@@ -0,0 +1,41 @@
+/*
+ *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  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:
+  // Disable overloaded virtual function warning. TODO(magjed): Remove once
+  // http://crbug/webrtc/6402 is fixed.
+  using WebRtcVideoEncoderFactory::CreateVideoEncoder;
+
+  std::vector<cricket::VideoCodec> supported_codecs_;
+};
+
+}  // namespace cricket
+
+#endif  // WEBRTC_MEDIA_ENGINE_INTERNALENCODERFACTORY_H_
diff --git a/webrtc/media/engine/payload_type_mapper.cc b/webrtc/media/engine/payload_type_mapper.cc
index 477c7ab..0d449c4 100644
--- a/webrtc/media/engine/payload_type_mapper.cc
+++ b/webrtc/media/engine/payload_type_mapper.cc
@@ -53,41 +53,18 @@
           {{"G729",   8000, 1}, 18},
 
           // Payload type assignments currently used by WebRTC.
-          // Includes video and data to reduce collisions (and thus
-          // reassignments).
+          // Includes data to reduce collisions (and thus reassignments)
           // RTX codecs mapping to specific video payload types
-          {{kRtxCodecName,    90000, 0,
-              {{kCodecParamAssociatedPayloadType,
-                      std::to_string(kDefaultVp8PlType)}}},
-                kDefaultRtxVp8PlType},
-          {{kRtxCodecName,    90000, 0,
-              {{kCodecParamAssociatedPayloadType,
-                      std::to_string(kDefaultVp9PlType)}}},
-                kDefaultRtxVp9PlType},
-          {{kRtxCodecName,    90000, 0,
-              {{kCodecParamAssociatedPayloadType,
-                      std::to_string(kDefaultRedPlType)}}},
-                kDefaultRtxRedPlType},
-          {{kRtxCodecName,    90000, 0,
-              {{kCodecParamAssociatedPayloadType,
-                      std::to_string(kDefaultH264PlType)}}},
-                kDefaultRtxH264ConstrainedBaselinePlType},
           // Other codecs
-          {{kVp8CodecName,    90000, 0}, kDefaultVp8PlType},
-          {{kVp9CodecName,    90000, 0}, kDefaultVp9PlType},
           {{kGoogleRtpDataCodecName, 0, 0}, kGoogleRtpDataCodecPlType},
           {{kIlbcCodecName,    8000, 1}, 102},
           {{kIsacCodecName,   16000, 1}, 103},
           {{kIsacCodecName,   32000, 1}, 104},
           {{kCnCodecName,     16000, 1}, 105},
           {{kCnCodecName,     32000, 1}, 106},
-          {{kH264CodecName,   90000, 0}, kDefaultH264PlType},
           {{kGoogleSctpDataCodecName, 0, 0}, kGoogleSctpDataCodecPlType},
           {{kOpusCodecName,   48000, 2,
               {{"minptime", "10"}, {"useinbandfec", "1"}}}, 111},
-          {{kRedCodecName,    90000, 0}, kDefaultRedPlType},
-          {{kUlpfecCodecName, 90000, 0}, kDefaultUlpfecType},
-          {{kFlexfecCodecName, 90000, 0}, kDefaultFlexfecPlType},
           // 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},
diff --git a/webrtc/media/engine/payload_type_mapper_unittest.cc b/webrtc/media/engine/payload_type_mapper_unittest.cc
index 6ff8c0f..628eb0c 100644
--- a/webrtc/media/engine/payload_type_mapper_unittest.cc
+++ b/webrtc/media/engine/payload_type_mapper_unittest.cc
@@ -60,28 +60,8 @@
 }
 
 TEST_F(PayloadTypeMapperTest, WebRTCPayloadTypes) {
-  // Tests that the payload mapper knows about the formats we've been using in
-  // WebRTC, with their hard coded values.
-  auto video_mapping = [this] (const char *name) {
-    return FindMapping({name, kVideoCodecClockrate, 0});
-  };
-  EXPECT_EQ(kDefaultVp8PlType,  video_mapping(kVp8CodecName));
-  EXPECT_EQ(kDefaultVp9PlType,  video_mapping(kVp9CodecName));
-  EXPECT_EQ(kDefaultH264PlType, video_mapping(kH264CodecName));
-  EXPECT_EQ(kDefaultRedPlType,  video_mapping(kRedCodecName));
-  EXPECT_EQ(kDefaultUlpfecType, video_mapping(kUlpfecCodecName));
-  EXPECT_EQ(kDefaultFlexfecPlType, video_mapping(kFlexfecCodecName));
-
-  auto rtx_mapping = [this] (int payload_type) {
-    return FindMapping({kRtxCodecName, kVideoCodecClockrate, 0,
-        {{ kCodecParamAssociatedPayloadType, std::to_string(payload_type)}}});
-  };
-  EXPECT_EQ(kDefaultRtxVp8PlType,  rtx_mapping(kDefaultVp8PlType));
-  EXPECT_EQ(kDefaultRtxVp9PlType,  rtx_mapping(kDefaultVp9PlType));
-  EXPECT_EQ(kDefaultRtxH264ConstrainedBaselinePlType,
-            rtx_mapping(kDefaultH264PlType));
-  EXPECT_EQ(kDefaultRtxRedPlType,  rtx_mapping(kDefaultRedPlType));
-
+  // 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});
   };
diff --git a/webrtc/media/engine/videoencodersoftwarefallbackwrapper.cc b/webrtc/media/engine/videoencodersoftwarefallbackwrapper.cc
index cc37a91..0de15b3 100644
--- a/webrtc/media/engine/videoencodersoftwarefallbackwrapper.cc
+++ b/webrtc/media/engine/videoencodersoftwarefallbackwrapper.cc
@@ -11,12 +11,13 @@
 #include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h"
 
 #include "webrtc/base/logging.h"
+#include "webrtc/media/engine/internalencoderfactory.h"
 #include "webrtc/modules/video_coding/include/video_error_codes.h"
 
 namespace webrtc {
 
 VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper(
-    VideoCodecType codec_type,
+    const cricket::VideoCodec& codec,
     webrtc::VideoEncoder* encoder)
     : number_of_cores_(0),
       max_payload_size_(0),
@@ -25,17 +26,18 @@
       channel_parameters_set_(false),
       packet_loss_(0),
       rtt_(0),
-      encoder_type_(CodecToEncoderType(codec_type)),
+      codec_(codec),
       encoder_(encoder),
       callback_(nullptr) {}
 
 bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
-  if (!VideoEncoder::IsSupportedSoftware(encoder_type_)) {
+  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(VideoEncoder::Create(encoder_type_));
+  fallback_encoder_.reset(internal_factory.CreateVideoEncoder(codec_));
   if (fallback_encoder_->InitEncode(&codec_settings_, number_of_cores_,
                                     max_payload_size_) !=
       WEBRTC_VIDEO_CODEC_OK) {
@@ -77,7 +79,7 @@
 
   int32_t ret =
       encoder_->InitEncode(codec_settings, number_of_cores, max_payload_size);
-  if (ret == WEBRTC_VIDEO_CODEC_OK || encoder_type_ == kUnsupportedCodec) {
+  if (ret == WEBRTC_VIDEO_CODEC_OK || codec_.name.empty()) {
     if (fallback_encoder_)
       fallback_encoder_->Release();
     fallback_encoder_.reset();
diff --git a/webrtc/media/engine/videoencodersoftwarefallbackwrapper.h b/webrtc/media/engine/videoencodersoftwarefallbackwrapper.h
index 5d81f4a..05e815d 100644
--- a/webrtc/media/engine/videoencodersoftwarefallbackwrapper.h
+++ b/webrtc/media/engine/videoencodersoftwarefallbackwrapper.h
@@ -15,6 +15,7 @@
 #include <string>
 #include <vector>
 
+#include "webrtc/media/base/codec.h"
 #include "webrtc/video_encoder.h"
 
 namespace webrtc {
@@ -24,7 +25,7 @@
 // hardware restrictions, such as max resolution.
 class VideoEncoderSoftwareFallbackWrapper : public VideoEncoder {
  public:
-  VideoEncoderSoftwareFallbackWrapper(VideoCodecType codec_type,
+  VideoEncoderSoftwareFallbackWrapper(const cricket::VideoCodec& codec,
                                       webrtc::VideoEncoder* encoder);
 
   int32_t InitEncode(const VideoCodec* codec_settings,
@@ -63,7 +64,7 @@
   uint32_t packet_loss_;
   int64_t rtt_;
 
-  const EncoderType encoder_type_;
+  const cricket::VideoCodec codec_;
   webrtc::VideoEncoder* const encoder_;
 
   std::unique_ptr<webrtc::VideoEncoder> fallback_encoder_;
diff --git a/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc b/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
index 42d6b47..ca06e92 100644
--- a/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
+++ b/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
@@ -28,7 +28,7 @@
 class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
  protected:
   VideoEncoderSoftwareFallbackWrapperTest()
-      : fallback_wrapper_(kVideoCodecVP8, &fake_encoder_) {}
+      : fallback_wrapper_(cricket::VideoCodec("VP8"), &fake_encoder_) {}
 
   class CountingFakeEncoder : public VideoEncoder {
    public:
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index 5238348..2016cf6 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -24,14 +24,13 @@
 #include "webrtc/call.h"
 #include "webrtc/common_video/h264/profile_level_id.h"
 #include "webrtc/media/engine/constants.h"
+#include "webrtc/media/engine/internalencoderfactory.h"
 #include "webrtc/media/engine/simulcast.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/modules/video_coding/codecs/h264/include/h264.h"
 #include "webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
 #include "webrtc/system_wrappers/include/field_trial.h"
 #include "webrtc/video_decoder.h"
 #include "webrtc/video_encoder.h"
@@ -170,13 +169,6 @@
       FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
 }
 
-static VideoCodec MakeVideoCodecWithDefaultFeedbackParams(int payload_type,
-                                                          const char* name) {
-  VideoCodec codec(payload_type, name);
-  AddDefaultFeedbackParams(&codec);
-  return codec;
-}
-
 static std::string CodecVectorToString(const std::vector<VideoCodec>& codecs) {
   std::stringstream out;
   out << '{';
@@ -392,73 +384,6 @@
 // Minimum time interval for logging stats.
 static const int64_t kStatsLogIntervalMs = 10000;
 
-// Adds |codec| to |list|, and also adds an RTX codec if |codec|'s name is
-// recognized.
-// TODO(deadbeef): Should we add RTX codecs for external codecs whose names we
-// don't recognize?
-void AddCodecAndMaybeRtxCodec(const VideoCodec& codec,
-                              std::vector<VideoCodec>* codecs) {
-  codecs->push_back(codec);
-  int rtx_payload_type = 0;
-  if (CodecNamesEq(codec.name, kVp8CodecName)) {
-    rtx_payload_type = kDefaultRtxVp8PlType;
-  } else if (CodecNamesEq(codec.name, kVp9CodecName)) {
-    rtx_payload_type = kDefaultRtxVp9PlType;
-  } else if (CodecNamesEq(codec.name, kH264CodecName)) {
-    // Parse H264 profile.
-    const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id =
-        webrtc::H264::ParseSdpProfileLevelId(codec.params);
-    if (!profile_level_id)
-      return;
-    const webrtc::H264::Profile profile = profile_level_id->profile;
-    // In H.264, we only support rtx for constrained baseline and constrained
-    // high profile.
-    if (profile == webrtc::H264::kProfileConstrainedBaseline) {
-      rtx_payload_type = kDefaultRtxH264ConstrainedBaselinePlType;
-    } else if (profile == webrtc::H264::kProfileConstrainedHigh) {
-      rtx_payload_type = kDefaultRtxH264ConstrainedHighPlType;
-    } else {
-      return;
-    }
-  } else if (CodecNamesEq(codec.name, kRedCodecName)) {
-    rtx_payload_type = kDefaultRtxRedPlType;
-  } else {
-    return;
-  }
-  codecs->push_back(VideoCodec::CreateRtxCodec(rtx_payload_type, codec.id));
-}
-
-std::vector<VideoCodec> DefaultVideoCodecList() {
-  std::vector<VideoCodec> codecs;
-  AddCodecAndMaybeRtxCodec(
-      MakeVideoCodecWithDefaultFeedbackParams(kDefaultVp8PlType, kVp8CodecName),
-      &codecs);
-  if (webrtc::VP9Encoder::IsSupported() && webrtc::VP9Decoder::IsSupported()) {
-    AddCodecAndMaybeRtxCodec(MakeVideoCodecWithDefaultFeedbackParams(
-                                 kDefaultVp9PlType, kVp9CodecName),
-                             &codecs);
-  }
-  if (webrtc::H264Encoder::IsSupported() &&
-      webrtc::H264Decoder::IsSupported()) {
-    VideoCodec codec = MakeVideoCodecWithDefaultFeedbackParams(
-        kDefaultH264PlType, kH264CodecName);
-    // TODO(hta): Move all parameter generation for SDP into the codec
-    // implementation, for all codecs and parameters.
-    // TODO(hta): Move selection of profile-level-id to H.264 codec
-    // implementation.
-    // TODO(hta): Set FMTP parameters for all codecs of type H264.
-    codec.SetParam(kH264FmtpProfileLevelId,
-                   kH264ProfileLevelConstrainedBaseline);
-    codec.SetParam(kH264FmtpLevelAsymmetryAllowed, "1");
-    codec.SetParam(kH264FmtpPacketizationMode, "1");
-    AddCodecAndMaybeRtxCodec(codec, &codecs);
-  }
-  AddCodecAndMaybeRtxCodec(VideoCodec(kDefaultRedPlType, kRedCodecName),
-                           &codecs);
-  codecs.push_back(VideoCodec(kDefaultUlpfecType, kUlpfecCodecName));
-  return codecs;
-}
-
 static std::vector<VideoCodec> GetSupportedCodecs(
     const WebRtcVideoEncoderFactory* external_encoder_factory);
 
@@ -634,50 +559,87 @@
   video_codecs_ = GetSupportedCodecs(encoder_factory);
 }
 
-static std::vector<VideoCodec> GetSupportedCodecs(
-    const WebRtcVideoEncoderFactory* external_encoder_factory) {
-  std::vector<VideoCodec> supported_codecs = DefaultVideoCodecList();
-
-  if (external_encoder_factory == nullptr) {
-    LOG(LS_INFO) << "Supported codecs: "
-                 << CodecVectorToString(supported_codecs);
-    return supported_codecs;
-  }
-
-  std::stringstream out;
-  const std::vector<VideoCodec>& codecs =
-      external_encoder_factory->supported_codecs();
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    VideoCodec codec = codecs[i];
-    out << codec.name;
-    if (i != codecs.size() - 1) {
-      out << ", ";
+// This is a helper function for AppendVideoCodecs below. It will return the
+// first unused dynamic payload type (in the range [96, 127]), or nothing if no
+// payload type is unused.
+static rtc::Optional<int> NextFreePayloadType(
+    const std::vector<VideoCodec>& codecs) {
+  static const int kFirstDynamicPayloadType = 96;
+  static const int kLastDynamicPayloadType = 127;
+  bool is_payload_used[1 + kLastDynamicPayloadType - kFirstDynamicPayloadType] =
+      {false};
+  for (const VideoCodec& codec : codecs) {
+    if (kFirstDynamicPayloadType <= codec.id &&
+        codec.id <= kLastDynamicPayloadType) {
+      is_payload_used[codec.id - kFirstDynamicPayloadType] = true;
     }
-    // Don't add internally-supported codecs twice.
-    if (FindMatchingCodec(supported_codecs, codec))
+  }
+  for (int i = kFirstDynamicPayloadType; i <= kLastDynamicPayloadType; ++i) {
+    if (!is_payload_used[i - kFirstDynamicPayloadType])
+      return rtc::Optional<int>(i);
+  }
+  // No free payload type.
+  return rtc::Optional<int>();
+}
+
+// This is a helper function for GetSupportedCodecs below. It will append new
+// unique codecs from |input_codecs| to |unified_codecs|. It will add default
+// feedback params to the codecs and will also add an associated RTX codec for
+// recognized codecs (VP8, VP9, H264, and Red).
+static void AppendVideoCodecs(const std::vector<VideoCodec>& input_codecs,
+                              std::vector<VideoCodec>* unified_codecs) {
+  for (VideoCodec codec : input_codecs) {
+    const rtc::Optional<int> payload_type =
+        NextFreePayloadType(*unified_codecs);
+    if (!payload_type)
+      return;
+    codec.id = *payload_type;
+    // TODO(magjed): Move the responsibility of setting these parameters to the
+    // encoder factories instead.
+    if (codec.name != kRedCodecName && codec.name != kUlpfecCodecName)
+      AddDefaultFeedbackParams(&codec);
+    // Don't add same codec twice.
+    if (FindMatchingCodec(*unified_codecs, codec))
       continue;
 
-    // External video encoders are given payloads 120-127. This also means that
-    // we only support up to 8 external payload types.
-    // TODO(deadbeef): mediasession.cc already has code to dynamically
-    // determine a payload type. We should be able to just leave the payload
-    // type empty and let mediasession determine it. However, currently RTX
-    // codecs are associated to codecs by payload type, meaning we DO need
-    // to allocate unique payload types here. So to make this change we would
-    // need to make RTX codecs associated by name instead.
-    const int kExternalVideoPayloadTypeBase = 120;
-    size_t payload_type = kExternalVideoPayloadTypeBase + i;
-    RTC_DCHECK(payload_type < 128);
-    codec.id = payload_type;
+    unified_codecs->push_back(codec);
 
-    AddDefaultFeedbackParams(&codec);
-    AddCodecAndMaybeRtxCodec(codec, &supported_codecs);
+    // 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)) {
+      const rtc::Optional<int> rtx_payload_type =
+          NextFreePayloadType(*unified_codecs);
+      if (!rtx_payload_type)
+        return;
+      unified_codecs->push_back(
+          VideoCodec::CreateRtxCodec(*rtx_payload_type, codec.id));
+    }
   }
-  LOG(LS_INFO) << "Supported codecs (incl. external codecs): "
-               << CodecVectorToString(supported_codecs);
-  LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
-               << out.str();
-  return supported_codecs;
+}
+
+static std::vector<VideoCodec> GetSupportedCodecs(
+    const WebRtcVideoEncoderFactory* external_encoder_factory) {
+  const std::vector<VideoCodec> internal_codecs =
+      InternalEncoderFactory().supported_codecs();
+  LOG(LS_INFO) << "Internally supported codecs: "
+               << CodecVectorToString(internal_codecs);
+
+  std::vector<VideoCodec> unified_codecs;
+  AppendVideoCodecs(internal_codecs, &unified_codecs);
+
+  if (external_encoder_factory != nullptr) {
+    const std::vector<VideoCodec>& external_codecs =
+        external_encoder_factory->supported_codecs();
+    AppendVideoCodecs(external_codecs, &unified_codecs);
+    LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
+                 << CodecVectorToString(external_codecs);
+  }
+
+  return unified_codecs;
 }
 
 WebRtcVideoChannel2::WebRtcVideoChannel2(
@@ -1555,16 +1517,16 @@
 
 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder(
     webrtc::VideoEncoder* encoder,
-    webrtc::VideoCodecType type,
+    const cricket::VideoCodec& codec,
     bool external)
     : encoder(encoder),
       external_encoder(nullptr),
-      type(type),
+      codec(codec),
       external(external) {
   if (external) {
     external_encoder = encoder;
     this->encoder =
-        new webrtc::VideoEncoderSoftwareFallbackWrapper(type, encoder);
+        new webrtc::VideoEncoderSoftwareFallbackWrapper(codec, encoder);
   }
 }
 
@@ -1592,7 +1554,7 @@
       encoder_sink_(nullptr),
       parameters_(std::move(config), options, max_bitrate_bps, codec_settings),
       rtp_parameters_(CreateRtpParametersWithOneEncoding()),
-      allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false),
+      allocated_encoder_(nullptr, cricket::VideoCodec(), false),
       sending_(false),
       last_frame_timestamp_us_(0) {
   parameters_.config.rtp.max_packet_size = kVideoMtu;
@@ -1727,36 +1689,32 @@
 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
     const VideoCodec& codec) {
   RTC_DCHECK_RUN_ON(&thread_checker_);
-  webrtc::VideoCodecType type = CodecTypeFromName(codec.name);
-
   // Do not re-create encoders of the same type.
-  if (type == allocated_encoder_.type && allocated_encoder_.encoder != NULL) {
+  if (codec == allocated_encoder_.codec &&
+      allocated_encoder_.encoder != nullptr) {
     return allocated_encoder_;
   }
 
-  if (external_encoder_factory_ != NULL) {
+  // Try creating external encoder.
+  if (external_encoder_factory_ != nullptr &&
+      FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
     webrtc::VideoEncoder* encoder =
         external_encoder_factory_->CreateVideoEncoder(codec);
-    if (encoder != NULL) {
-      return AllocatedEncoder(encoder, type, true);
-    }
+    if (encoder != nullptr)
+      return AllocatedEncoder(encoder, codec, true /* is_external */);
   }
 
-  if (type == webrtc::kVideoCodecVP8) {
-    return AllocatedEncoder(
-        webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp8), type, false);
-  } else if (type == webrtc::kVideoCodecVP9) {
-    return AllocatedEncoder(
-        webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kVp9), type, false);
-  } else if (type == webrtc::kVideoCodecH264) {
-    return AllocatedEncoder(
-        webrtc::VideoEncoder::Create(webrtc::VideoEncoder::kH264), type, false);
+  // Try creating internal encoder.
+  InternalEncoderFactory internal_encoder_factory;
+  if (FindMatchingCodec(internal_encoder_factory.supported_codecs(), codec)) {
+    return AllocatedEncoder(internal_encoder_factory.CreateVideoEncoder(codec),
+                            codec, false /* is_external */);
   }
 
   // This shouldn't happen, we should not be trying to create something we don't
   // support.
   RTC_DCHECK(false);
-  return AllocatedEncoder(NULL, webrtc::kVideoCodecUnknown, false);
+  return AllocatedEncoder(NULL, cricket::VideoCodec(), false);
 }
 
 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h
index 28dfb977..546799e 100644
--- a/webrtc/media/engine/webrtcvideoengine2.h
+++ b/webrtc/media/engine/webrtcvideoengine2.h
@@ -61,9 +61,6 @@
 
 struct Device;
 
-// Exposed here for unittests.
-std::vector<VideoCodec> DefaultVideoCodecList();
-
 class UnsignalledSsrcHandler {
  public:
   enum Action {
@@ -301,11 +298,11 @@
 
     struct AllocatedEncoder {
       AllocatedEncoder(webrtc::VideoEncoder* encoder,
-                       webrtc::VideoCodecType type,
+                       const cricket::VideoCodec& codec,
                        bool external);
       webrtc::VideoEncoder* encoder;
       webrtc::VideoEncoder* external_encoder;
-      webrtc::VideoCodecType type;
+      cricket::VideoCodec codec;
       bool external;
     };
 
diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
index 19b7d64..70de267 100644
--- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc
+++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
@@ -33,13 +33,6 @@
 namespace {
 static const int kDefaultQpMax = 56;
 
-static const cricket::VideoCodec kVp8Codec(100, "VP8");
-static const cricket::VideoCodec kVp9Codec(101, "VP9");
-static const cricket::VideoCodec kH264Codec(102, "H264");
-
-static const cricket::VideoCodec kRedCodec(116, "red");
-static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec");
-
 static const uint8_t kRedRtxPayloadType = 125;
 
 static const uint32_t kSsrcs1[] = {1};
@@ -49,6 +42,11 @@
 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)));
@@ -113,19 +111,15 @@
     std::vector<VideoCodec> engine_codecs = engine_.codecs();
     RTC_DCHECK(!engine_codecs.empty());
     bool codec_set = false;
-    for (size_t i = 0; i < engine_codecs.size(); ++i) {
-      if (engine_codecs[i].name == "red") {
-        default_red_codec_ = engine_codecs[i];
-      } else if (engine_codecs[i].name == "ulpfec") {
-        default_ulpfec_codec_ = engine_codecs[i];
-      } else if (engine_codecs[i].name == "rtx") {
+    for (const cricket::VideoCodec& codec : engine_codecs) {
+      if (codec.name == "rtx") {
         int associated_payload_type;
-        if (engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
-                                      &associated_payload_type)) {
-          default_apt_rtx_types_[associated_payload_type] = engine_codecs[i].id;
+        if (codec.GetParam(kCodecParamAssociatedPayloadType,
+                           &associated_payload_type)) {
+          default_apt_rtx_types_[associated_payload_type] = codec.id;
         }
-      } else if (!codec_set) {
-        default_codec_ = engine_codecs[i];
+      } else if (!codec_set && codec.name != "red" && codec.name != "ulpfec") {
+        default_codec_ = codec;
         codec_set = true;
       }
     }
@@ -134,9 +128,12 @@
   }
 
  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(
-      cricket::WebRtcVideoEncoderFactory* encoder_factory,
-      const std::vector<VideoCodec>& codecs);
+      cricket::WebRtcVideoEncoderFactory* encoder_factory);
 
   VideoMediaChannel* SetUpForExternalDecoderFactory(
       cricket::WebRtcVideoDecoderFactory* decoder_factory,
@@ -151,8 +148,6 @@
   std::unique_ptr<webrtc::Call> call_;
   WebRtcVideoEngine2 engine_;
   VideoCodec default_codec_;
-  VideoCodec default_red_codec_;
-  VideoCodec default_ulpfec_codec_;
   std::map<int, int> default_apt_rtx_types_;
 };
 
@@ -240,15 +235,15 @@
 
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
   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));
@@ -272,13 +267,13 @@
 
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
   // 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));
@@ -297,12 +292,9 @@
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
   encoder_factory.AddSupportedVideoCodecType("VP9");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
   EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
   // Set capturer.
@@ -313,6 +305,9 @@
 
   // 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.
@@ -353,11 +348,9 @@
 TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
 
   EXPECT_TRUE(
       channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -378,6 +371,8 @@
 
   // 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());
 
@@ -416,13 +411,13 @@
 
   // 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 Constrained Baseline and
-  // Constrained High got an associated RTX codec, but not High.
+  // 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_FALSE(HasRtxCodec(
+  EXPECT_TRUE(HasRtxCodec(
       codecs, FindMatchingCodec(codecs, h264_high)->id));
 }
 
@@ -430,14 +425,11 @@
     bool use_external_encoder) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
   std::unique_ptr<VideoMediaChannel> channel;
   FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_));
   call_.reset(fake_call);
   if (use_external_encoder) {
-    channel.reset(
-        SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
+    channel.reset(SetUpForExternalEncoderFactory(&encoder_factory));
   } else {
     engine_.Init();
     channel.reset(
@@ -445,6 +437,8 @@
   }
   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];
@@ -467,11 +461,9 @@
 TEST_F(WebRtcVideoEngine2Test, CanConstructDecoderForVp9EncoderFactory) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP9");
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kVp9Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
 
   EXPECT_TRUE(
       channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -481,12 +473,10 @@
 TEST_F(WebRtcVideoEngine2Test, PropagatesInputFrameTimestamp) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kVp8Codec);
   FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_));
   call_.reset(fake_call);
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
 
   EXPECT_TRUE(
       channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -536,16 +526,29 @@
   EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
 }
 
+cricket::VideoCodec WebRtcVideoEngine2Test::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* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
-    cricket::WebRtcVideoEncoderFactory* encoder_factory,
-    const std::vector<VideoCodec>& codecs) {
+    cricket::WebRtcVideoEncoderFactory* encoder_factory) {
   engine_.SetExternalEncoderFactory(encoder_factory);
   engine_.Init();
 
   VideoMediaChannel* channel =
       engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions());
   cricket::VideoSendParameters parameters;
-  parameters.codecs = codecs;
+  // 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;
@@ -569,11 +572,9 @@
 TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("VP8");
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kVp8Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
@@ -610,18 +611,16 @@
 TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("H264");
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kH264Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
 
   EXPECT_TRUE(
       channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
   ASSERT_EQ(1u, encoder_factory.encoders().size());
 
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
   ASSERT_EQ(0u, encoder_factory.encoders().size());
 }
@@ -630,11 +629,15 @@
        DontUseExternalEncoderFactoryForUnsupportedCodecs) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("H264");
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kVp8Codec);
+
+  engine_.SetExternalEncoderFactory(&encoder_factory);
+  engine_.Init();
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions()));
+  cricket::VideoSendParameters parameters;
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  EXPECT_TRUE(channel->SetSendParameters(parameters));
 
   EXPECT_TRUE(
       channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -648,11 +651,14 @@
   encoder_factory.AddSupportedVideoCodecType("VP8");
   encoder_factory.AddSupportedVideoCodecType("H264");
 
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kVp8Codec);
+  engine_.SetExternalEncoderFactory(&encoder_factory);
+  engine_.Init();
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions()));
+  cricket::VideoSendParameters parameters;
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  EXPECT_TRUE(channel->SetSendParameters(parameters));
 
   std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
 
@@ -685,11 +691,14 @@
   encoder_factory.AddSupportedVideoCodecType("VP8");
   encoder_factory.AddSupportedVideoCodecType("H264");
 
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kH264Codec);
+  engine_.SetExternalEncoderFactory(&encoder_factory);
+  engine_.Init();
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions()));
+  cricket::VideoSendParameters parameters;
+  parameters.codecs.push_back(GetEngineCodec("H264"));
+  EXPECT_TRUE(channel->SetSendParameters(parameters));
 
   EXPECT_TRUE(
       channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
@@ -714,11 +723,9 @@
 TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) {
   cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
   encoder_factory.AddSupportedVideoCodecType("H264");
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kH264Codec);
 
   std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalEncoderFactory(&encoder_factory, codecs));
+      SetUpForExternalEncoderFactory(&encoder_factory));
 
   const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
   EXPECT_TRUE(
@@ -761,7 +768,7 @@
   cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
   decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs));
@@ -791,7 +798,7 @@
   cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
   decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
   std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(kH264Codec);
+  codecs.push_back(GetEngineCodec("H264"));
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetUpForExternalDecoderFactory(&decoder_factory, codecs));
@@ -806,7 +813,17 @@
  protected:
   typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
 
-  cricket::VideoCodec DefaultCodec() override { return kVp8Codec; }
+  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.
@@ -814,7 +831,7 @@
   cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
   decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
 
   std::unique_ptr<VideoMediaChannel> channel(
       SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs));
@@ -865,15 +882,15 @@
 WEBRTC_BASE_TEST(MultipleSendStreams);
 
 TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
-  SendAndReceive(cricket::VideoCodec(100, "VP8"));
+  SendAndReceive(GetEngineCodec("VP8"));
 }
 
 TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
-  SendAndReceive(cricket::VideoCodec(100, "VP8"));
+  SendAndReceive(GetEngineCodec("VP8"));
 }
 
 TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
-  SendAndReceive(cricket::VideoCodec(100, "VP8"));
+  SendAndReceive(GetEngineCodec("VP8"));
 }
 
 TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
@@ -882,7 +899,7 @@
   // 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 = kVp8Codec;
+  cricket::VideoCodec codec = GetEngineCodec("VP8");
   codec.params[kCodecParamStartBitrate] = "1000000";
   Base::TwoStreamsSendAndReceive(codec);
 }
@@ -942,7 +959,7 @@
                                           int expected_max_bitrate_bps) {
     auto& codecs = send_parameters_.codecs;
     codecs.clear();
-    codecs.push_back(kVp8Codec);
+    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;
@@ -1054,8 +1071,8 @@
 
   void TestCpuAdaptation(bool enable_overuse, bool is_screenshare);
   void TestReceiverLocalSsrcConfiguration(bool receiver_first);
-  void TestReceiveUnsignalledSsrcPacket(uint8_t payload_type,
-                                        bool expect_created_receive_stream);
+  void TestReceiveUnsignaledSsrcPacket(uint8_t payload_type,
+                                       bool expect_created_receive_stream);
 
   FakeVideoSendStream* SetDenoisingOption(
       uint32_t ssrc,
@@ -1429,7 +1446,7 @@
 
   // Verify that REMB is turned off when send(!) codecs without REMB are set.
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  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];
@@ -1450,7 +1467,7 @@
   // Verify that transport cc feedback is turned off when send(!) codecs without
   // transport cc feedback are set.
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  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];
@@ -1496,7 +1513,7 @@
 
   // Verify that NACK is turned off when send(!) codecs without NACK are set.
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  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];
@@ -1521,7 +1538,7 @@
 // earlier.
 TEST_F(WebRtcVideoChannel2Test, ReconfiguresEncodersWhenNotSending) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
   channel_->SetSend(false);
 
@@ -1548,7 +1565,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
   static const int kScreenshareMinBitrateKbps = 800;
-  cricket::VideoCodec codec = kVp8Codec;
+  cricket::VideoCodec codec = GetEngineCodec("VP8");
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(codec);
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
@@ -1737,7 +1754,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, VerifyVp8SpecificSettings) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
 
   // Single-stream settings should apply with RTX as well (verifies that we
@@ -1818,7 +1835,7 @@
   EXPECT_EQ(cricket::CS_RUNNING,
             capturer.Start(capturer.GetSupportedFormats()->front()));
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
   FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
 
@@ -1867,7 +1884,7 @@
 
 TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp9Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP9"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
 
   FakeVideoSendStream* stream = SetUpSimulcast(false, false);
@@ -1927,7 +1944,7 @@
  protected:
   void VerifySettings(int num_spatial_layers, int num_temporal_layers) {
     cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(kVp9Codec);
+    parameters.codecs.push_back(GetEngineCodec("VP9"));
     ASSERT_TRUE(channel_->SetSendParameters(parameters));
 
     FakeVideoSendStream* stream = SetUpSimulcast(false, false);
@@ -1998,7 +2015,7 @@
 }
 
 TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruseAndChangeResolution) {
-  cricket::VideoCodec codec = kVp8Codec;
+  cricket::VideoCodec codec = GetEngineCodec("VP8");
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(codec);
 
@@ -2072,7 +2089,7 @@
 }
 
 TEST_F(WebRtcVideoChannel2Test, PreviousAdaptationDoesNotApplyToScreenshare) {
-  cricket::VideoCodec codec = kVp8Codec;
+  cricket::VideoCodec codec = GetEngineCodec("VP8");
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(codec);
 
@@ -2136,7 +2153,7 @@
 
 void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse,
                                                 bool is_screenshare) {
-  cricket::VideoCodec codec = kVp8Codec;
+  cricket::VideoCodec codec = GetEngineCodec("VP8");
   cricket::VideoSendParameters parameters;
   parameters.codecs.push_back(codec);
 
@@ -2260,8 +2277,8 @@
 
   // Make sure NACK and FEC are enabled on the correct payload types.
   EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
-  EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.ulpfec.ulpfec_payload_type);
-  EXPECT_EQ(default_red_codec_.id, config.rtp.ulpfec.red_payload_type);
+  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]);
@@ -2271,7 +2288,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
 
   FakeVideoSendStream* stream = AddSendStream();
@@ -2283,8 +2300,11 @@
 
 TEST_F(WebRtcVideoChannel2Test,
        SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
+  const int kUnusedPayloadType = 127;
+  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType));
+
   cricket::VideoSendParameters parameters;
-  cricket::VideoCodec rtx_codec(96, "rtx");
+  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.";
@@ -2292,31 +2312,39 @@
 
 TEST_F(WebRtcVideoChannel2Test,
        SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
-  cricket::VideoSendParameters parameters;
-  cricket::VideoCodec rtx_codec =
-      cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(rtx_codec);
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  cricket::VideoCodec rtx_codec2 =
-      cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
-  parameters.codecs.pop_back();
-  parameters.codecs.push_back(rtx_codec2);
-  EXPECT_FALSE(channel_->SetSendParameters(parameters))
-      << "RTX without matching video codec should be rejected.";
+  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(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kUlpfecCodec);
+  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(kUlpfecCodec.id, config.rtp.ulpfec.ulpfec_payload_type);
+  EXPECT_EQ(GetEngineCodec("ulpfec").id, config.rtp.ulpfec.ulpfec_payload_type);
 
   parameters.codecs.pop_back();
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
@@ -2461,7 +2489,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, SetMaxSendBitrateCanIncreaseSenderBitrate) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
   channel_->SetSend(true);
 
@@ -2488,7 +2516,7 @@
 TEST_F(WebRtcVideoChannel2Test,
        SetMaxSendBitrateCanIncreaseSimulcastSenderBitrate) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetSendParameters(parameters));
   channel_->SetSend(true);
 
@@ -2522,7 +2550,7 @@
 TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
   static const char* kMaxQuantization = "21";
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  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)),
@@ -2537,7 +2565,7 @@
   // TODO(pbos): Should we only allow the dynamic range?
   static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  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))
@@ -2547,8 +2575,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  // Only the dynamic payload types are valid for video codecs.
+  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))
@@ -2563,42 +2590,47 @@
 TEST_F(WebRtcVideoChannel2Test,
        SetSendCodecsIdenticalFirstCodecDoesntRecreateStream) {
   cricket::VideoSendParameters parameters1;
-  parameters1.codecs.push_back(kVp8Codec);
-  parameters1.codecs.push_back(kVp9Codec);
+  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(kVp8Codec);
+  parameters2.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel_->SetSendParameters(parameters2));
   EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
 }
 
 TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 }
 
 // Test that we set our inbound RTX codecs properly.
 TEST_F(WebRtcVideoChannel2Test, 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(kVp8Codec);
-  cricket::VideoCodec rtx_codec(96, "rtx");
+  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", kVp8Codec.id + 1);
+  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", kVp8Codec.id);
+  parameters.codecs[1].SetParam("apt", GetEngineCodec("VP8").id);
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 
-  cricket::VideoCodec rtx_codec2(97, "rtx");
+  cricket::VideoCodec rtx_codec2(kUnusedPayloadType2, "rtx");
   rtx_codec2.SetParam("apt", rtx_codec.id);
   parameters.codecs.push_back(rtx_codec2);
 
@@ -2609,7 +2641,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   parameters.codecs[0].id = 99;
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 }
@@ -2627,7 +2659,7 @@
 
 TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   parameters.codecs.push_back(VideoCodec(101, "WTF3"));
   EXPECT_FALSE(channel_->SetRecvParameters(parameters));
 }
@@ -2636,34 +2668,34 @@
 TEST_F(WebRtcVideoChannel2Test,
        DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  parameters.codecs.push_back(GetEngineCodec("VP9"));
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 }
 
 TEST_F(WebRtcVideoChannel2Test,
        DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  parameters.codecs.push_back(GetEngineCodec("VP9"));
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
   FAIL();  // TODO(pbos): Verify that the FEC parameters are set for all codecs.
 }
 
 TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
   cricket::VideoSendParameters send_parameters;
-  send_parameters.codecs.push_back(kVp8Codec);
-  send_parameters.codecs.push_back(kRedCodec);
-  send_parameters.codecs.push_back(kUlpfecCodec);
+  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(kUlpfecCodec.id,
+  EXPECT_EQ(GetEngineCodec("ulpfec").id,
             stream->GetConfig().rtp.ulpfec.ulpfec_payload_type);
 
   cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(kVp8Codec);
+  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
   ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
   stream = fake_call_->GetVideoReceiveStreams()[0];
   ASSERT_TRUE(stream != NULL);
@@ -2673,41 +2705,43 @@
 
 TEST_F(WebRtcVideoChannel2Test, SetSendParamsWithFecEnablesFec) {
   FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_EQ(kUlpfecCodec.id,
+  EXPECT_EQ(GetEngineCodec("ulpfec").id,
             stream->GetConfig().rtp.ulpfec.ulpfec_payload_type);
 
   cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(kVp8Codec);
-  recv_parameters.codecs.push_back(kRedCodec);
-  recv_parameters.codecs.push_back(kUlpfecCodec);
+  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 != NULL);
-  EXPECT_EQ(kUlpfecCodec.id, stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
+  EXPECT_EQ(GetEngineCodec("ulpfec").id,
+            stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
       << "FEC should be enabled on the receive stream.";
 
   cricket::VideoSendParameters send_parameters;
-  send_parameters.codecs.push_back(kVp8Codec);
-  send_parameters.codecs.push_back(kRedCodec);
-  send_parameters.codecs.push_back(kUlpfecCodec);
+  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(kUlpfecCodec.id, stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
+  EXPECT_EQ(GetEngineCodec("ulpfec").id,
+            stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
       << "FEC should be enabled on the receive stream.";
 }
 
 TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kRedCodec);
+  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(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  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));
 }
@@ -2715,8 +2749,8 @@
 TEST_F(WebRtcVideoChannel2Test,
        SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   parameters.codecs[1].id += 1;
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 }
@@ -2726,16 +2760,16 @@
 TEST_F(WebRtcVideoChannel2Test,
        SetRecvCodecsDifferentOrderDoesntRecreateStream) {
   cricket::VideoRecvParameters parameters1;
-  parameters1.codecs.push_back(kVp8Codec);
-  parameters1.codecs.push_back(kRedCodec);
+  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(kRedCodec);
-  parameters2.codecs.push_back(kVp8Codec);
+  parameters2.codecs.push_back(GetEngineCodec("red"));
+  parameters2.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel_->SetRecvParameters(parameters2));
   EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
 }
@@ -2855,14 +2889,14 @@
 
 TEST_F(WebRtcVideoChannel2Test, GetStatsReportsSentCodecName) {
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
 
   AddSendStream();
 
   cricket::VideoMediaInfo info;
   ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(kVp8Codec.name, info.senders[0].codec_name);
+  EXPECT_EQ("VP8", info.senders[0].codec_name);
 }
 
 TEST_F(WebRtcVideoChannel2Test, GetStatsReportsEncoderImplementationName) {
@@ -3275,7 +3309,7 @@
   EXPECT_STREQ("", info.receivers[0].codec_name.c_str());
 
   // Report VP8 if we're receiving it.
-  stats.current_payload_type = kDefaultVp8PlType;
+  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());
@@ -3287,12 +3321,15 @@
   EXPECT_STREQ("", info.receivers[0].codec_name.c_str());
 }
 
-void WebRtcVideoChannel2Test::TestReceiveUnsignalledSsrcPacket(
+void WebRtcVideoChannel2Test::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, kDefaultRedPlType);
+      VideoCodec::CreateRtxCodec(kRedRtxPayloadType, GetEngineCodec("red").id);
   recv_parameters_.codecs.push_back(red_rtx_codec);
   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
 
@@ -3319,23 +3356,30 @@
 }
 
 TEST_F(WebRtcVideoChannel2Test, Vp8PacketCreatesUnsignalledStream) {
-  TestReceiveUnsignalledSsrcPacket(kDefaultVp8PlType, true);
+  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP8").id,
+                                  true /* expect_created_receive_stream */);
 }
 
 TEST_F(WebRtcVideoChannel2Test, Vp9PacketCreatesUnsignalledStream) {
-  TestReceiveUnsignalledSsrcPacket(kDefaultVp9PlType, true);
+  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP9").id,
+                                  true /* expect_created_receive_stream */);
 }
 
 TEST_F(WebRtcVideoChannel2Test, RtxPacketDoesntCreateUnsignalledStream) {
-  TestReceiveUnsignalledSsrcPacket(kDefaultRtxVp8PlType, false);
+  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(WebRtcVideoChannel2Test, UlpfecPacketDoesntCreateUnsignalledStream) {
-  TestReceiveUnsignalledSsrcPacket(kDefaultUlpfecType, false);
+  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("ulpfec").id,
+                                  false /* expect_created_receive_stream */);
 }
 
 TEST_F(WebRtcVideoChannel2Test, RedRtxPacketDoesntCreateUnsignalledStream) {
-  TestReceiveUnsignalledSsrcPacket(kRedRtxPayloadType, false);
+  TestReceiveUnsignaledSsrcPacket(kRedRtxPayloadType,
+                                  false /* expect_created_receive_stream */);
 }
 
 TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) {
@@ -3430,8 +3474,8 @@
        InactiveStreamDoesntStartSendingWhenReconfigured) {
   // Set an initial codec list, which will be modified later.
   cricket::VideoSendParameters parameters1;
-  parameters1.codecs.push_back(kVp8Codec);
-  parameters1.codecs.push_back(kVp9Codec);
+  parameters1.codecs.push_back(GetEngineCodec("VP8"));
+  parameters1.codecs.push_back(GetEngineCodec("VP9"));
   EXPECT_TRUE(channel_->SetSendParameters(parameters1));
 
   FakeVideoSendStream* stream = AddSendStream();
@@ -3450,8 +3494,8 @@
 
   // Reorder the codec list, causing the stream to be reconfigured.
   cricket::VideoSendParameters parameters2;
-  parameters2.codecs.push_back(kVp9Codec);
-  parameters2.codecs.push_back(kVp8Codec);
+  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.
@@ -3468,23 +3512,25 @@
 TEST_F(WebRtcVideoChannel2Test, GetRtpSendParametersCodecs) {
   AddSendStream();
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  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(kVp8Codec.ToCodecParameters(), rtp_parameters.codecs[0]);
-  EXPECT_EQ(kVp9Codec.ToCodecParameters(), rtp_parameters.codecs[1]);
+  EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(),
+            rtp_parameters.codecs[0]);
+  EXPECT_EQ(GetEngineCodec("VP9").ToCodecParameters(),
+            rtp_parameters.codecs[1]);
 }
 
 // Test that if we set/get parameters multiple times, we get the same results.
 TEST_F(WebRtcVideoChannel2Test, SetAndGetRtpSendParameters) {
   AddSendStream();
   cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  parameters.codecs.push_back(GetEngineCodec("VP9"));
   EXPECT_TRUE(channel_->SetSendParameters(parameters));
 
   webrtc::RtpParameters initial_params =
@@ -3501,15 +3547,17 @@
 TEST_F(WebRtcVideoChannel2Test, GetRtpReceiveParametersCodecs) {
   AddRecvStream();
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  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(kVp8Codec.ToCodecParameters(), rtp_parameters.codecs[0]);
-  EXPECT_EQ(kVp9Codec.ToCodecParameters(), rtp_parameters.codecs[1]);
+  EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(),
+            rtp_parameters.codecs[0]);
+  EXPECT_EQ(GetEngineCodec("VP9").ToCodecParameters(),
+            rtp_parameters.codecs[1]);
 }
 
 #if defined(WEBRTC_USE_H264)
@@ -3566,8 +3614,8 @@
 TEST_F(WebRtcVideoChannel2Test, SetAndGetRtpReceiveParameters) {
   AddRecvStream();
   cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(kVp8Codec);
-  parameters.codecs.push_back(kVp9Codec);
+  parameters.codecs.push_back(GetEngineCodec("VP8"));
+  parameters.codecs.push_back(GetEngineCodec("VP9"));
   EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 
   webrtc::RtpParameters initial_params =
@@ -3761,16 +3809,15 @@
 };
 
 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
-  VerifySimulcastSettings(kVp8Codec, 640, 360, 2, 2);
+  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 640, 360, 2, 2);
 }
 
 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
-  VerifySimulcastSettings(kVp8Codec, 1280, 720, 3, 3);
+  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 3);
 }
 
 // Test that we normalize send codec format size in simulcast.
 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
-  cricket::VideoCodec codec(kVp8Codec);
-  VerifySimulcastSettings(codec, 541, 271, 2, 2);
+  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 541, 271, 2, 2);
 }
 }  // namespace cricket
diff --git a/webrtc/video/BUILD.gn b/webrtc/video/BUILD.gn
index 7b6dd8f..5f9f75c 100644
--- a/webrtc/video/BUILD.gn
+++ b/webrtc/video/BUILD.gn
@@ -37,7 +37,6 @@
     "transport_adapter.cc",
     "transport_adapter.h",
     "video_decoder.cc",
-    "video_encoder.cc",
     "video_receive_stream.cc",
     "video_receive_stream.h",
     "video_send_stream.cc",
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
index 3ff3bd2..d93dd24 100644
--- a/webrtc/video/end_to_end_tests.cc
+++ b/webrtc/video/end_to_end_tests.cc
@@ -353,23 +353,20 @@
 };
 
 TEST_F(EndToEndTest, SendsAndReceivesVP8Rotation90) {
-  CodecObserver test(5, kVideoRotation_90, "VP8",
-                     VideoEncoder::Create(VideoEncoder::kVp8),
+  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",
-                     VideoEncoder::Create(VideoEncoder::kVp9),
+  CodecObserver test(500, kVideoRotation_0, "VP9", VP9Encoder::Create(),
                      VP9Decoder::Create());
   RunBaseTest(&test);
 }
 
 TEST_F(EndToEndTest, SendsAndReceivesVP9VideoRotation90) {
-  CodecObserver test(5, kVideoRotation_90, "VP9",
-                     VideoEncoder::Create(VideoEncoder::kVp9),
+  CodecObserver test(5, kVideoRotation_90, "VP9", VP9Encoder::Create(),
                      VP9Decoder::Create());
   RunBaseTest(&test);
 }
@@ -377,15 +374,13 @@
 
 #if defined(WEBRTC_USE_H264)
 TEST_F(EndToEndTest, SendsAndReceivesH264) {
-  CodecObserver test(500, kVideoRotation_0, "H264",
-                     VideoEncoder::Create(VideoEncoder::kH264),
+  CodecObserver test(500, kVideoRotation_0, "H264", H264Encoder::Create(),
                      H264Decoder::Create());
   RunBaseTest(&test);
 }
 
 TEST_F(EndToEndTest, SendsAndReceivesH264VideoRotation90) {
-  CodecObserver test(5, kVideoRotation_90, "H264",
-                     VideoEncoder::Create(VideoEncoder::kH264),
+  CodecObserver test(5, kVideoRotation_90, "H264", H264Encoder::Create(),
                      H264Decoder::Create());
   RunBaseTest(&test);
 }
@@ -765,7 +760,7 @@
           ulpfec_sequence_number_(0),
           has_last_sequence_number_(false),
           last_sequence_number_(0),
-          encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)),
+          encoder_(VP8Encoder::Create()),
           decoder_(VP8Decoder::Create()) {}
 
    private:
@@ -933,7 +928,7 @@
           retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0]
                                           : kVideoSendSsrcs[0]),
           retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)),
-          encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)),
+          encoder_(VP8Encoder::Create()),
           marker_bits_observed_(0),
           retransmitted_timestamp_(0) {}
 
@@ -1332,7 +1327,7 @@
 
     std::unique_ptr<VideoEncoder> encoders[kNumStreams];
     for (size_t i = 0; i < kNumStreams; ++i)
-      encoders[i].reset(VideoEncoder::Create(VideoEncoder::kVp8));
+      encoders[i].reset(VP8Encoder::Create());
 
     VideoSendStream* send_streams[kNumStreams];
     VideoReceiveStream* receive_streams[kNumStreams];
@@ -2182,9 +2177,7 @@
           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 ? VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)
-                      : nullptr),
+          vp8_encoder_(use_red ? VP8Encoder::Create() : nullptr),
           sender_call_(nullptr),
           receiver_call_(nullptr),
           start_runtime_ms_(-1),
@@ -3975,7 +3968,7 @@
         VideoSendStream::Config* send_config,
         std::vector<VideoReceiveStream::Config>* receive_configs,
         VideoEncoderConfig* encoder_config) override {
-      encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8));
+      encoder_.reset(VP8Encoder::Create());
       decoder_.reset(VP8Decoder::Create());
 
       send_config->post_encode_callback = this;
diff --git a/webrtc/video/video_encoder.cc b/webrtc/video/video_encoder.cc
deleted file mode 100644
index f4e8156..0000000
--- a/webrtc/video/video_encoder.cc
+++ /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.
- */
-
-#include "webrtc/video_encoder.h"
-
-#include "webrtc/base/checks.h"
-#include "webrtc/base/logging.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"
-
-namespace webrtc {
-VideoEncoder* VideoEncoder::Create(VideoEncoder::EncoderType codec_type) {
-  RTC_DCHECK(IsSupportedSoftware(codec_type));
-  switch (codec_type) {
-    case kH264:
-      return H264Encoder::Create();
-    case kVp8:
-      return VP8Encoder::Create();
-    case kVp9:
-      return VP9Encoder::Create();
-    case kUnsupportedCodec:
-      RTC_NOTREACHED();
-      return nullptr;
-  }
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-bool VideoEncoder::IsSupportedSoftware(EncoderType codec_type) {
-  switch (codec_type) {
-    case kH264:
-      return H264Encoder::IsSupported();
-    case kVp8:
-      return true;
-    case kVp9:
-      return VP9Encoder::IsSupported();
-    case kUnsupportedCodec:
-      RTC_NOTREACHED();
-      return false;
-  }
-  RTC_NOTREACHED();
-  return false;
-}
-
-VideoEncoder::EncoderType VideoEncoder::CodecToEncoderType(
-    VideoCodecType codec_type) {
-  switch (codec_type) {
-    case kVideoCodecH264:
-      return VideoEncoder::kH264;
-    case kVideoCodecVP8:
-      return VideoEncoder::kVp8;
-    case kVideoCodecVP9:
-      return VideoEncoder::kVp9;
-    default:
-      return VideoEncoder::kUnsupportedCodec;
-  }
-}
-
-}  // namespace webrtc
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc
index d0624c0..42f2404 100644
--- a/webrtc/video/video_quality_test.cc
+++ b/webrtc/video/video_quality_test.cc
@@ -29,6 +29,9 @@
 #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_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/system_wrappers/include/cpu_info.h"
 #include "webrtc/test/gtest.h"
 #include "webrtc/test/layer_filtering_transport.h"
@@ -1006,13 +1009,13 @@
 
   int payload_type;
   if (params_.video.codec == "H264") {
-    video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kH264));
+    video_encoder_.reset(H264Encoder::Create());
     payload_type = kPayloadTypeH264;
   } else if (params_.video.codec == "VP8") {
-    video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8));
+    video_encoder_.reset(VP8Encoder::Create());
     payload_type = kPayloadTypeVP8;
   } else if (params_.video.codec == "VP9") {
-    video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp9));
+    video_encoder_.reset(VP9Encoder::Create());
     payload_type = kPayloadTypeVP9;
   } else {
     RTC_NOTREACHED() << "Codec not supported!";
diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
index c9d8f76..cc76b13 100644
--- a/webrtc/video/video_send_stream_tests.cc
+++ b/webrtc/video/video_send_stream_tests.cc
@@ -24,6 +24,7 @@
 #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/system_wrappers/include/sleep.h"
 #include "webrtc/test/call_test.h"
@@ -367,9 +368,9 @@
     if (codec == "H264") {
       encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock()));
     } else if (codec == "VP8") {
-      encoder_.reset(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8));
+      encoder_.reset(VP8Encoder::Create());
     } else if (codec == "VP9") {
-      encoder_.reset(VideoEncoder::Create(VideoEncoder::EncoderType::kVp9));
+      encoder_.reset(VP9Encoder::Create());
     } else {
       RTC_NOTREACHED();
     }
@@ -552,9 +553,9 @@
     if (codec == "H264") {
       encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock()));
     } else if (codec == "VP8") {
-      encoder_.reset(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8));
+      encoder_.reset(VP8Encoder::Create());
     } else if (codec == "VP9") {
-      encoder_.reset(VideoEncoder::Create(VideoEncoder::EncoderType::kVp9));
+      encoder_.reset(VP9Encoder::Create());
     } else {
       RTC_NOTREACHED();
     }
diff --git a/webrtc/video_encoder.h b/webrtc/video_encoder.h
index 3a99717..f8a04f2 100644
--- a/webrtc/video_encoder.h
+++ b/webrtc/video_encoder.h
@@ -63,19 +63,6 @@
 
 class VideoEncoder {
  public:
-  enum EncoderType {
-    kH264,
-    kVp8,
-    kVp9,
-    kUnsupportedCodec,
-  };
-
-  static VideoEncoder* Create(EncoderType codec_type);
-  // Returns true if this type of encoder can be created using
-  // VideoEncoder::Create.
-  static bool IsSupportedSoftware(EncoderType codec_type);
-  static EncoderType CodecToEncoderType(VideoCodecType codec_type);
-
   static VideoCodecVP8 GetDefaultVp8Settings();
   static VideoCodecVP9 GetDefaultVp9Settings();
   static VideoCodecH264 GetDefaultH264Settings();