Reland "Add helper functions for migrating to new video codec factories"

This reverts commit a7678667fc726979ca27d2429689d5735cca425d.

Reason for reland: Fix initializer list constructor.

Original change's description:
> Revert "Add helper functions for migrating to new video codec factories"
> 
> This reverts commit 1c9623c70db42550d152c127e01434004087f743.
> 
> Reason for revert: Breaks brace initialization:
> 
> cricket::VideoDecoderParams params = { "deadbeef" };
> 
> I suggest adding an initializer list constructor.
> 
> Original change's description:
> > Add helper functions for migrating to new video codec factories
> > 
> > This CL adds helper functions in media/engine/convert_legacy_video_factory.h to
> > convert from the old WebRtcVideoEncoder and WebRtcVideoDecoder to the new
> > webrtc::VideoEncoder and webrtc::VideoDecoder.
> > 
> > The purpose is to make it as easy as possible for clients to migrate to the new
> > API and allow us to stop depending on the internal SW codecs as soon as possible.
> > 
> > There still exists an ugly decoder adapter class in the video engine. The reason
> > is that we need to continue to pass in the |receive_stream_id| decoder params to
> > some legacy clients.
> > 
> > Bug: webrtc:7925
> > Change-Id: I43ff03e036411a85d4940fe517a34489f171d698
> > Reviewed-on: https://webrtc-review.googlesource.com/15181
> > Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
> > Reviewed-by: Anders Carlsson <andersc@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#20475}
> 
> TBR=magjed@webrtc.org,andersc@webrtc.org
> 
> Change-Id: I0d1084dc86979fbca748d9ba287d1db3dbe52b44
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: webrtc:7925
> Reviewed-on: https://webrtc-review.googlesource.com/17160
> Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
> Commit-Queue: Taylor Brandstetter <deadbeef@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#20486}

TBR=deadbeef@webrtc.org,magjed@webrtc.org,andersc@webrtc.org

Change-Id: Ic825d133b6e1c6e5aad811ba528751dd5ed85e67
Bug: webrtc:7925
Reviewed-on: https://webrtc-review.googlesource.com/17360
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20501}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 2e46ee5..d6b6b4e 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -143,6 +143,8 @@
     "engine/apm_helpers.cc",
     "engine/apm_helpers.h",
     "engine/constants.h",
+    "engine/convert_legacy_video_factory.cc",
+    "engine/convert_legacy_video_factory.h",
     "engine/internaldecoderfactory.cc",
     "engine/internaldecoderfactory.h",
     "engine/internalencoderfactory.cc",
diff --git a/media/engine/convert_legacy_video_factory.cc b/media/engine/convert_legacy_video_factory.cc
new file mode 100644
index 0000000..6495e27
--- /dev/null
+++ b/media/engine/convert_legacy_video_factory.cc
@@ -0,0 +1,191 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "media/engine/convert_legacy_video_factory.h"
+
+#include <utility>
+#include <vector>
+
+#include "api/video_codecs/video_decoder_factory.h"
+#include "api/video_codecs/video_encoder_factory.h"
+#include "media/engine/internaldecoderfactory.h"
+#include "media/engine/internalencoderfactory.h"
+#include "media/engine/scopedvideodecoder.h"
+#include "media/engine/scopedvideoencoder.h"
+#include "media/engine/simulcast_encoder_adapter.h"
+#include "media/engine/videodecodersoftwarefallbackwrapper.h"
+#include "media/engine/videoencodersoftwarefallbackwrapper.h"
+#include "media/engine/vp8_encoder_simulcast_proxy.h"
+#include "media/engine/webrtcvideodecoderfactory.h"
+#include "media/engine/webrtcvideoencoderfactory.h"
+#include "rtc_base/checks.h"
+
+namespace cricket {
+
+namespace {
+
+class EncoderAdapter : public webrtc::VideoEncoderFactory {
+ public:
+  explicit EncoderAdapter(
+      std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory)
+      : internal_encoder_factory_(new InternalEncoderFactory()),
+        external_encoder_factory_(std::move(external_encoder_factory)) {}
+
+  webrtc::VideoEncoderFactory::CodecInfo QueryVideoEncoder(
+      const webrtc::SdpVideoFormat& format) const {
+    const VideoCodec codec(format);
+    if (external_encoder_factory_ != nullptr &&
+        FindMatchingCodec(external_encoder_factory_->supported_codecs(),
+                          codec)) {
+      // Format is supported by the external factory.
+      const webrtc::VideoCodecType codec_type =
+          webrtc::PayloadStringToCodecType(codec.name);
+      webrtc::VideoEncoderFactory::CodecInfo info;
+      info.has_internal_source =
+          external_encoder_factory_->EncoderTypeHasInternalSource(codec_type);
+      info.is_hardware_accelerated = true;
+      return info;
+    }
+
+    // Format must be one of the internal formats.
+    RTC_DCHECK(FindMatchingCodec(internal_encoder_factory_->supported_codecs(),
+                                 codec));
+    webrtc::VideoEncoderFactory::CodecInfo info;
+    info.has_internal_source = false;
+    info.is_hardware_accelerated = false;
+    return info;
+  }
+
+  std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder(
+      const webrtc::SdpVideoFormat& format) {
+    const VideoCodec codec(format);
+    // Try creating external encoder.
+    if (external_encoder_factory_ != nullptr &&
+        FindMatchingCodec(external_encoder_factory_->supported_codecs(),
+                          codec)) {
+      std::unique_ptr<webrtc::VideoEncoder> external_encoder;
+      if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) {
+        // If it's a codec type we can simulcast, create a wrapped encoder.
+        external_encoder = std::unique_ptr<webrtc::VideoEncoder>(
+            new webrtc::SimulcastEncoderAdapter(
+                external_encoder_factory_.get()));
+      } else {
+        external_encoder =
+            CreateScopedVideoEncoder(external_encoder_factory_.get(), codec);
+      }
+      if (external_encoder) {
+        return std::unique_ptr<webrtc::VideoEncoder>(
+            new webrtc::VideoEncoderSoftwareFallbackWrapper(
+                codec, std::move(external_encoder)));
+      }
+    }
+
+    // Try creating internal encoder.
+    if (FindMatchingCodec(internal_encoder_factory_->supported_codecs(),
+                          codec)) {
+      if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) {
+        return std::unique_ptr<webrtc::VideoEncoder>(
+            new webrtc::VP8EncoderSimulcastProxy(
+                internal_encoder_factory_.get()));
+      } else {
+        return std::unique_ptr<webrtc::VideoEncoder>(
+            internal_encoder_factory_->CreateVideoEncoder(codec));
+      }
+    }
+
+    // This shouldn't happen, we should not be trying to create something we
+    // don't support.
+    RTC_NOTREACHED();
+    return nullptr;
+  }
+
+  std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const {
+    std::vector<VideoCodec> codecs =
+        InternalEncoderFactory().supported_codecs();
+
+    // Add external codecs.
+    if (external_encoder_factory_ != nullptr) {
+      const std::vector<VideoCodec>& external_codecs =
+          external_encoder_factory_->supported_codecs();
+      for (const VideoCodec& codec : external_codecs) {
+        // Don't add same codec twice.
+        if (!FindMatchingCodec(codecs, codec))
+          codecs.push_back(codec);
+      }
+    }
+
+    std::vector<webrtc::SdpVideoFormat> formats;
+    for (const VideoCodec& codec : codecs) {
+      formats.push_back(webrtc::SdpVideoFormat(codec.name, codec.params));
+    }
+
+    return formats;
+  }
+
+ private:
+  const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_;
+  const std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory_;
+};
+
+class DecoderAdapter : public webrtc::VideoDecoderFactory {
+ public:
+  explicit DecoderAdapter(
+      std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory)
+      : internal_decoder_factory_(new InternalDecoderFactory()),
+        external_decoder_factory_(std::move(external_decoder_factory)) {}
+
+  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
+      const webrtc::SdpVideoFormat& format) override {
+    const VideoCodec codec(format);
+    const VideoDecoderParams params = {};
+    if (external_decoder_factory_ != nullptr) {
+      std::unique_ptr<webrtc::VideoDecoder> external_decoder =
+          CreateScopedVideoDecoder(external_decoder_factory_.get(), codec,
+                                   params);
+      if (external_decoder) {
+        webrtc::VideoCodecType type =
+            webrtc::PayloadStringToCodecType(codec.name);
+        std::unique_ptr<webrtc::VideoDecoder> internal_decoder(
+            new webrtc::VideoDecoderSoftwareFallbackWrapper(
+                type, std::move(external_decoder)));
+        return internal_decoder;
+      }
+    }
+    std::unique_ptr<webrtc::VideoDecoder> internal_decoder(
+        internal_decoder_factory_->CreateVideoDecoderWithParams(codec, params));
+    return internal_decoder;
+  }
+
+  std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override {
+    // This is not implemented for the legacy decoder factory.
+    RTC_NOTREACHED();
+    return std::vector<webrtc::SdpVideoFormat>();
+  }
+
+ private:
+  const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_;
+  const std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory_;
+};
+
+}  // namespace
+
+std::unique_ptr<webrtc::VideoEncoderFactory> ConvertVideoEncoderFactory(
+    std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory) {
+  return std::unique_ptr<webrtc::VideoEncoderFactory>(
+      new EncoderAdapter(std::move(external_encoder_factory)));
+}
+
+std::unique_ptr<webrtc::VideoDecoderFactory> ConvertVideoDecoderFactory(
+    std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory) {
+  return std::unique_ptr<webrtc::VideoDecoderFactory>(
+      new DecoderAdapter(std::move(external_decoder_factory)));
+}
+
+}  // namespace cricket
diff --git a/media/engine/convert_legacy_video_factory.h b/media/engine/convert_legacy_video_factory.h
new file mode 100644
index 0000000..5bd3580
--- /dev/null
+++ b/media/engine/convert_legacy_video_factory.h
@@ -0,0 +1,38 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef MEDIA_ENGINE_CONVERT_LEGACY_VIDEO_FACTORY_H_
+#define MEDIA_ENGINE_CONVERT_LEGACY_VIDEO_FACTORY_H_
+
+#include <memory>
+
+namespace webrtc {
+class VideoEncoderFactory;
+class VideoDecoderFactory;
+}  // namespace webrtc
+
+namespace cricket {
+
+class WebRtcVideoEncoderFactory;
+class WebRtcVideoDecoderFactory;
+
+// Adds internal SW codecs, simulcast, SW fallback wrappers, and converts to the
+// new type of codec factories. The purpose of these functions is to provide an
+// easy way for clients to migrate to the API with new factory types.
+// TODO(magjed): Remove once old factories are gone, webrtc:7925.
+std::unique_ptr<webrtc::VideoEncoderFactory> ConvertVideoEncoderFactory(
+    std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory);
+
+std::unique_ptr<webrtc::VideoDecoderFactory> ConvertVideoDecoderFactory(
+    std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory);
+
+}  // namespace cricket
+
+#endif  // MEDIA_ENGINE_CONVERT_LEGACY_VIDEO_FACTORY_H_
diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc
index 9767aad..3a99fc3 100644
--- a/media/engine/webrtcvideoengine.cc
+++ b/media/engine/webrtcvideoengine.cc
@@ -25,16 +25,9 @@
 #include "call/call.h"
 #include "common_video/h264/profile_level_id.h"
 #include "media/engine/constants.h"
-#include "media/engine/internaldecoderfactory.h"
-#include "media/engine/internalencoderfactory.h"
-#include "media/engine/scopedvideodecoder.h"
-#include "media/engine/scopedvideoencoder.h"
+#include "media/engine/convert_legacy_video_factory.h"
 #include "media/engine/simulcast.h"
-#include "media/engine/simulcast_encoder_adapter.h"
-#include "media/engine/videodecodersoftwarefallbackwrapper.h"
-#include "media/engine/videoencodersoftwarefallbackwrapper.h"
 #include "media/engine/webrtcmediaengine.h"
-#include "media/engine/webrtcvideoencoderfactory.h"
 #include "media/engine/webrtcvoiceengine.h"
 #include "rtc_base/copyonwritebuffer.h"
 #include "rtc_base/logging.h"
@@ -42,141 +35,103 @@
 #include "rtc_base/timeutils.h"
 #include "rtc_base/trace_event.h"
 #include "system_wrappers/include/field_trial.h"
-#include "vp8_encoder_simulcast_proxy.h"
 
 using DegradationPreference = webrtc::VideoSendStream::DegradationPreference;
 
 namespace cricket {
-// This class represents all encoders, i.e. both internal and external. It
-// serves as a temporary adapter between WebRtcVideoEncoderFactory* and the new
-// factory interface that is being developed.
-// TODO(magjed): Remove once WebRtcVideoEncoderFactory* is deprecated and
+
+// Hack in order to pass in |receive_stream_id| to legacy clients.
+// TODO(magjed): Remove once WebRtcVideoDecoderFactory is deprecated and
 // webrtc:7925 is fixed.
-class EncoderFactoryAdapter {
- public:
-  struct AllocatedEncoder {
-    AllocatedEncoder() = default;
-    AllocatedEncoder(std::unique_ptr<webrtc::VideoEncoder> encoder,
-                     bool is_hardware_accelerated,
-                     bool has_internal_source);
-
-    std::unique_ptr<webrtc::VideoEncoder> encoder;
-    bool is_hardware_accelerated;
-    bool has_internal_source;
-  };
-
-  virtual ~EncoderFactoryAdapter() {}
-
-  virtual AllocatedEncoder CreateVideoEncoder(
-      const VideoCodec& codec) const = 0;
-
-  virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0;
-};
-
 class DecoderFactoryAdapter {
  public:
-  virtual ~DecoderFactoryAdapter() {}
+  explicit DecoderFactoryAdapter(
+      std::unique_ptr<WebRtcVideoDecoderFactory> external_video_decoder_factory)
+      : cricket_decoder_with_params_(new CricketDecoderWithParams(
+            std::move(external_video_decoder_factory))),
+        decoder_factory_(ConvertVideoDecoderFactory(
+            std::unique_ptr<WebRtcVideoDecoderFactory>(
+                cricket_decoder_with_params_))) {}
 
-  virtual std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const VideoCodec& codec,
-      const VideoDecoderParams& decoder_params) const = 0;
+  explicit DecoderFactoryAdapter(
+      std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory)
+      : cricket_decoder_with_params_(nullptr),
+        decoder_factory_(std::move(video_decoder_factory)) {}
+
+  void SetReceiveStreamId(const std::string& receive_stream_id) {
+    if (cricket_decoder_with_params_)
+      cricket_decoder_with_params_->SetReceiveStreamId(receive_stream_id);
+  }
+
+  std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const {
+    return decoder_factory_->GetSupportedFormats();
+  }
+
+  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
+      const webrtc::SdpVideoFormat& format) {
+    return decoder_factory_->CreateVideoDecoder(format);
+  }
+
+ private:
+  // WebRtcVideoDecoderFactory implementation that allows to override
+  // |receive_stream_id|.
+  class CricketDecoderWithParams : public WebRtcVideoDecoderFactory {
+   public:
+    explicit CricketDecoderWithParams(
+        std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory)
+        : external_decoder_factory_(std::move(external_decoder_factory)) {}
+
+    void SetReceiveStreamId(const std::string& receive_stream_id) {
+      receive_stream_id_ = receive_stream_id;
+    }
+
+   private:
+    webrtc::VideoDecoder* CreateVideoDecoderWithParams(
+        const VideoCodec& codec,
+        VideoDecoderParams params) override {
+      if (!external_decoder_factory_)
+        return nullptr;
+      params.receive_stream_id = receive_stream_id_;
+      return external_decoder_factory_->CreateVideoDecoderWithParams(codec,
+                                                                     params);
+    }
+
+    webrtc::VideoDecoder* CreateVideoDecoderWithParams(
+        webrtc::VideoCodecType type,
+        VideoDecoderParams params) override {
+      RTC_NOTREACHED();
+      return nullptr;
+    }
+
+    void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override {
+      if (external_decoder_factory_) {
+        external_decoder_factory_->DestroyVideoDecoder(decoder);
+      } else {
+        delete decoder;
+      }
+    }
+
+    const std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory_;
+    std::string receive_stream_id_;
+  };
+
+  // If |cricket_decoder_with_params_| is non-null, it's owned by
+  // |decoder_factory_|.
+  CricketDecoderWithParams* const cricket_decoder_with_params_;
+  std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
 };
 
 namespace {
 
 std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
-    const std::vector<VideoCodec>& input_codecs);
+    const std::vector<webrtc::SdpVideoFormat>& input_formats);
 
-// Wraps cricket::WebRtcVideoEncoderFactory into common EncoderFactoryAdapter
-// interface.
-// TODO(magjed): Remove once WebRtcVideoEncoderFactory is deprecated and
-// webrtc:7925 is fixed.
-class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter {
- public:
-  explicit CricketEncoderFactoryAdapter(
-      std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory)
-      : internal_encoder_factory_(new InternalEncoderFactory()),
-        external_encoder_factory_(std::move(external_encoder_factory)) {}
-
- private:
-  AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec) const override;
-
-  std::vector<VideoCodec> GetSupportedCodecs() const override;
-
-  const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_;
-  const std::unique_ptr<WebRtcVideoEncoderFactory> external_encoder_factory_;
-};
-
-class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter {
- public:
-  explicit CricketDecoderFactoryAdapter(
-      std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory)
-      : internal_decoder_factory_(new InternalDecoderFactory()),
-        external_decoder_factory_(std::move(external_decoder_factory)) {}
-
- private:
-  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const VideoCodec& codec,
-      const VideoDecoderParams& decoder_params) const override;
-
-  const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_;
-  const std::unique_ptr<WebRtcVideoDecoderFactory> external_decoder_factory_;
-};
-
-// Wraps webrtc::VideoEncoderFactory into common EncoderFactoryAdapter
-// interface.
-class WebRtcEncoderFactoryAdapter : public EncoderFactoryAdapter {
- public:
-  explicit WebRtcEncoderFactoryAdapter(
-      std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory)
-      : encoder_factory_(std::move(encoder_factory)) {}
-
- private:
-  AllocatedEncoder CreateVideoEncoder(const VideoCodec& codec) const override {
-    if (!encoder_factory_)
-      return AllocatedEncoder();
-    const webrtc::SdpVideoFormat format(codec.name, codec.params);
-    const webrtc::VideoEncoderFactory::CodecInfo info =
-        encoder_factory_->QueryVideoEncoder(format);
-    return AllocatedEncoder(encoder_factory_->CreateVideoEncoder(format),
-                            info.is_hardware_accelerated,
-                            info.has_internal_source);
-  }
-
-  std::vector<VideoCodec> GetSupportedCodecs() const override {
-    if (!encoder_factory_)
-      return std::vector<VideoCodec>();
-    std::vector<VideoCodec> codecs;
-    for (const webrtc::SdpVideoFormat& format :
-         encoder_factory_->GetSupportedFormats()) {
-      codecs.push_back(VideoCodec(format));
-    }
-    return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
-  }
-
-  std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
-};
-
-// Wraps webrtc::VideoDecoderFactory into common DecoderFactoryAdapter
-// interface.
-class WebRtcDecoderFactoryAdapter : public DecoderFactoryAdapter {
- public:
-  explicit WebRtcDecoderFactoryAdapter(
-      std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory)
-      : decoder_factory_(std::move(decoder_factory)) {}
-
- private:
-  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const VideoCodec& codec,
-      const VideoDecoderParams& decoder_params) const override {
-    return decoder_factory_
-               ? decoder_factory_->CreateVideoDecoder(
-                     webrtc::SdpVideoFormat(codec.name, codec.params))
-               : nullptr;
-  }
-
-  std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
-};
+std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
+    const webrtc::VideoEncoderFactory* encoder_factory) {
+  return encoder_factory ? AssignPayloadTypesAndAddAssociatedRtxCodecs(
+                               encoder_factory->GetSupportedFormats())
+                         : std::vector<VideoCodec>();
+}
 
 // If this field trial is enabled, we will enable sending FlexFEC and disable
 // sending ULPFEC whenever the former has been negotiated in the SDPs.
@@ -448,9 +403,9 @@
 WebRtcVideoEngine::WebRtcVideoEngine(
     std::unique_ptr<WebRtcVideoEncoderFactory> external_video_encoder_factory,
     std::unique_ptr<WebRtcVideoDecoderFactory> external_video_decoder_factory)
-    : decoder_factory_(new CricketDecoderFactoryAdapter(
-          std::move(external_video_decoder_factory))),
-      encoder_factory_(new CricketEncoderFactoryAdapter(
+    : decoder_factory_(
+          new DecoderFactoryAdapter(std::move(external_video_decoder_factory))),
+      encoder_factory_(ConvertVideoEncoderFactory(
           std::move(external_video_encoder_factory))) {
   LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
 }
@@ -459,9 +414,8 @@
     std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
     std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory)
     : decoder_factory_(
-          new WebRtcDecoderFactoryAdapter(std::move(video_decoder_factory))),
-      encoder_factory_(
-          new WebRtcEncoderFactoryAdapter(std::move(video_encoder_factory))) {
+          new DecoderFactoryAdapter(std::move(video_decoder_factory))),
+      encoder_factory_(std::move(video_encoder_factory)) {
   LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
 }
 
@@ -479,7 +433,7 @@
 }
 
 std::vector<VideoCodec> WebRtcVideoEngine::codecs() const {
-  return encoder_factory_->GetSupportedCodecs();
+  return AssignPayloadTypesAndAddAssociatedRtxCodecs(encoder_factory_.get());
 }
 
 RtpCapabilities WebRtcVideoEngine::GetCapabilities() const {
@@ -514,12 +468,13 @@
 // (VP8, VP9, H264, and RED). It will also add default feedback params to the
 // codecs.
 std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
-    const std::vector<VideoCodec>& input_codecs) {
+    const std::vector<webrtc::SdpVideoFormat>& input_formats) {
   static const int kFirstDynamicPayloadType = 96;
   static const int kLastDynamicPayloadType = 127;
   int payload_type = kFirstDynamicPayloadType;
   std::vector<VideoCodec> output_codecs;
-  for (VideoCodec codec : input_codecs) {
+  for (const webrtc::SdpVideoFormat& format : input_formats) {
+    VideoCodec codec(format);
     codec.id = payload_type;
     AddDefaultFeedbackParams(&codec);
     output_codecs.push_back(codec);
@@ -549,34 +504,12 @@
 }
 }  // namespace
 
-std::vector<VideoCodec> CricketEncoderFactoryAdapter::GetSupportedCodecs()
-    const {
-  std::vector<VideoCodec> codecs = InternalEncoderFactory().supported_codecs();
-  LOG(LS_INFO) << "Internally supported codecs: "
-               << CodecVectorToString(codecs);
-
-  // Add external codecs.
-  if (external_encoder_factory_ != nullptr) {
-    const std::vector<VideoCodec>& external_codecs =
-        external_encoder_factory_->supported_codecs();
-    for (const VideoCodec& codec : external_codecs) {
-      // Don't add same codec twice.
-      if (!FindMatchingCodec(codecs, codec))
-        codecs.push_back(codec);
-    }
-    LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
-                 << CodecVectorToString(external_codecs);
-  }
-
-  return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
-}
-
 WebRtcVideoChannel::WebRtcVideoChannel(
     webrtc::Call* call,
     const MediaConfig& config,
     const VideoOptions& options,
-    const EncoderFactoryAdapter* encoder_factory,
-    const DecoderFactoryAdapter* decoder_factory)
+    webrtc::VideoEncoderFactory* encoder_factory,
+    DecoderFactoryAdapter* decoder_factory)
     : VideoMediaChannel(config),
       call_(call),
       unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_),
@@ -589,7 +522,8 @@
 
   rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
   sending_ = false;
-  recv_codecs_ = MapCodecs(encoder_factory_->GetSupportedCodecs());
+  recv_codecs_ =
+      MapCodecs(AssignPayloadTypesAndAddAssociatedRtxCodecs(encoder_factory_));
   recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type;
 }
 
@@ -604,7 +538,7 @@
 WebRtcVideoChannel::SelectSendVideoCodec(
     const std::vector<VideoCodecSettings>& remote_mapped_codecs) const {
   const std::vector<VideoCodec> local_supported_codecs =
-      encoder_factory_->GetSupportedCodecs();
+      AssignPayloadTypesAndAddAssociatedRtxCodecs(encoder_factory_);
   // Select the first remote codec that is supported locally.
   for (const VideoCodecSettings& remote_mapped_codec : remote_mapped_codecs) {
     // For H264, we will limit the encode level to the remote offered level
@@ -916,7 +850,7 @@
 
   // Verify that every mapped codec is supported locally.
   const std::vector<VideoCodec> local_supported_codecs =
-      encoder_factory_->GetSupportedCodecs();
+      AssignPayloadTypesAndAddAssociatedRtxCodecs(encoder_factory_);
   for (const VideoCodecSettings& mapped_codec : mapped_codecs) {
     if (!FindMatchingCodec(local_supported_codecs, mapped_codec.codec)) {
       LOG(LS_ERROR) << "SetRecvParameters called with unsupported video codec: "
@@ -1524,20 +1458,12 @@
       conference_mode(false),
       codec_settings(codec_settings) {}
 
-EncoderFactoryAdapter::AllocatedEncoder::AllocatedEncoder(
-    std::unique_ptr<webrtc::VideoEncoder> encoder,
-    bool is_hardware_accelerated,
-    bool has_internal_source)
-    : encoder(std::move(encoder)),
-      is_hardware_accelerated(is_hardware_accelerated),
-      has_internal_source(has_internal_source) {}
-
 WebRtcVideoChannel::WebRtcVideoSendStream::WebRtcVideoSendStream(
     webrtc::Call* call,
     const StreamParams& sp,
     webrtc::VideoSendStream::Config config,
     const VideoOptions& options,
-    const EncoderFactoryAdapter* encoder_factory,
+    webrtc::VideoEncoderFactory* encoder_factory,
     bool enable_cpu_overuse_detection,
     int max_bitrate_bps,
     const rtc::Optional<VideoCodecSettings>& codec_settings,
@@ -1685,57 +1611,6 @@
   return ssrcs_;
 }
 
-EncoderFactoryAdapter::AllocatedEncoder
-CricketEncoderFactoryAdapter::CreateVideoEncoder(
-    const VideoCodec& codec) const {
-  // Try creating external encoder.
-  if (external_encoder_factory_ != nullptr &&
-      FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
-    std::unique_ptr<webrtc::VideoEncoder> external_encoder;
-    if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) {
-      // If it's a codec type we can simulcast, create a wrapped encoder.
-      external_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-          new webrtc::SimulcastEncoderAdapter(external_encoder_factory_.get()));
-    } else {
-      external_encoder =
-          CreateScopedVideoEncoder(external_encoder_factory_.get(), codec);
-    }
-    if (external_encoder) {
-      std::unique_ptr<webrtc::VideoEncoder> internal_encoder(
-          new webrtc::VideoEncoderSoftwareFallbackWrapper(
-              codec, std::move(external_encoder)));
-      const webrtc::VideoCodecType codec_type =
-          webrtc::PayloadStringToCodecType(codec.name);
-      const bool has_internal_source =
-          external_encoder_factory_->EncoderTypeHasInternalSource(codec_type);
-      return AllocatedEncoder(std::move(internal_encoder),
-                              true /* is_hardware_accelerated */,
-                              has_internal_source);
-    }
-  }
-
-  // Try creating internal encoder.
-  std::unique_ptr<webrtc::VideoEncoder> internal_encoder;
-  if (FindMatchingCodec(internal_encoder_factory_->supported_codecs(), codec)) {
-    if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) {
-      internal_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-          new webrtc::VP8EncoderSimulcastProxy(
-              internal_encoder_factory_.get()));
-    } else {
-      internal_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-          internal_encoder_factory_->CreateVideoEncoder(codec));
-    }
-    return AllocatedEncoder(std::move(internal_encoder),
-                            false /* is_hardware_accelerated */,
-                            false /* has_internal_source */);
-  }
-
-  // This shouldn't happen, we should not be trying to create something we don't
-  // support.
-  RTC_NOTREACHED();
-  return AllocatedEncoder();
-}
-
 void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(
     const VideoCodecSettings& codec_settings,
     bool force_encoder_allocation) {
@@ -1749,15 +1624,18 @@
   std::unique_ptr<webrtc::VideoEncoder> new_encoder;
   if (force_encoder_allocation || !allocated_encoder_ ||
       allocated_codec_ != codec_settings.codec) {
-    EncoderFactoryAdapter::AllocatedEncoder new_allocated_encoder =
-        encoder_factory_->CreateVideoEncoder(codec_settings.codec);
-    new_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-        std::move(new_allocated_encoder.encoder));
+    const webrtc::SdpVideoFormat format(codec_settings.codec.name,
+                                        codec_settings.codec.params);
+    new_encoder = encoder_factory_->CreateVideoEncoder(format);
+
     parameters_.config.encoder_settings.encoder = new_encoder.get();
+
+    const webrtc::VideoEncoderFactory::CodecInfo info =
+        encoder_factory_->QueryVideoEncoder(format);
     parameters_.config.encoder_settings.full_overuse_time =
-        new_allocated_encoder.is_hardware_accelerated;
+        info.is_hardware_accelerated;
     parameters_.config.encoder_settings.internal_source =
-        new_allocated_encoder.has_internal_source;
+        info.has_internal_source;
   } else {
     new_encoder = std::move(allocated_encoder_);
   }
@@ -2131,7 +2009,7 @@
     webrtc::Call* call,
     const StreamParams& sp,
     webrtc::VideoReceiveStream::Config config,
-    const DecoderFactoryAdapter* decoder_factory,
+    DecoderFactoryAdapter* decoder_factory,
     bool default_stream,
     const std::vector<VideoCodecSettings>& recv_codecs,
     const webrtc::FlexfecReceiveStream::Config& flexfec_config)
@@ -2182,30 +2060,6 @@
   }
 }
 
-std::unique_ptr<webrtc::VideoDecoder>
-CricketDecoderFactoryAdapter::CreateVideoDecoder(
-    const VideoCodec& codec,
-    const VideoDecoderParams& decoder_params) const {
-  if (external_decoder_factory_ != nullptr) {
-    std::unique_ptr<webrtc::VideoDecoder> external_decoder =
-        CreateScopedVideoDecoder(external_decoder_factory_.get(), codec,
-                                 decoder_params);
-    if (external_decoder) {
-      webrtc::VideoCodecType type =
-          webrtc::PayloadStringToCodecType(codec.name);
-      std::unique_ptr<webrtc::VideoDecoder> internal_decoder(
-          new webrtc::VideoDecoderSoftwareFallbackWrapper(
-              type, std::move(external_decoder)));
-      return internal_decoder;
-    }
-  }
-
-  std::unique_ptr<webrtc::VideoDecoder> internal_decoder(
-      internal_decoder_factory_->CreateVideoDecoderWithParams(codec,
-                                                              decoder_params));
-  return internal_decoder;
-}
-
 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs(
     const std::vector<VideoCodecSettings>& recv_codecs,
     DecoderMap* old_decoders) {
@@ -2224,9 +2078,10 @@
       old_decoders->erase(it);
     }
 
-    if (!new_decoder) {
-      new_decoder = decoder_factory_->CreateVideoDecoder(recv_codec.codec,
-                                                         {stream_params_.id});
+    if (!new_decoder && decoder_factory_) {
+      decoder_factory_->SetReceiveStreamId(stream_params_.id);
+      new_decoder = decoder_factory_->CreateVideoDecoder(webrtc::SdpVideoFormat(
+          recv_codec.codec.name, recv_codec.codec.params));
     }
 
     webrtc::VideoReceiveStream::Decoder decoder;
diff --git a/media/engine/webrtcvideoengine.h b/media/engine/webrtcvideoengine.h
index 86aae6b..f9c053a 100644
--- a/media/engine/webrtcvideoengine.h
+++ b/media/engine/webrtcvideoengine.h
@@ -51,7 +51,6 @@
 namespace cricket {
 
 class DecoderFactoryAdapter;
-class EncoderFactoryAdapter;
 class VideoCapturer;
 class VideoProcessor;
 class VideoRenderer;
@@ -122,7 +121,7 @@
 
  private:
   const std::unique_ptr<DecoderFactoryAdapter> decoder_factory_;
-  const std::unique_ptr<EncoderFactoryAdapter> encoder_factory_;
+  const std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
 };
 
 class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
@@ -130,8 +129,8 @@
   WebRtcVideoChannel(webrtc::Call* call,
                      const MediaConfig& config,
                      const VideoOptions& options,
-                     const EncoderFactoryAdapter* encoder_factory,
-                     const DecoderFactoryAdapter* decoder_factory);
+                     webrtc::VideoEncoderFactory* encoder_factory,
+                     DecoderFactoryAdapter* decoder_factory);
   ~WebRtcVideoChannel() override;
 
   // VideoMediaChannel implementation
@@ -259,7 +258,7 @@
         const StreamParams& sp,
         webrtc::VideoSendStream::Config config,
         const VideoOptions& options,
-        const EncoderFactoryAdapter* encoder_factory,
+        webrtc::VideoEncoderFactory* encoder_factory,
         bool enable_cpu_overuse_detection,
         int max_bitrate_bps,
         const rtc::Optional<VideoCodecSettings>& codec_settings,
@@ -337,7 +336,7 @@
     const bool enable_cpu_overuse_detection_;
     rtc::VideoSourceInterface<webrtc::VideoFrame>* source_
         RTC_ACCESS_ON(&thread_checker_);
-    const EncoderFactoryAdapter* const encoder_factory_
+    webrtc::VideoEncoderFactory* const encoder_factory_
         RTC_ACCESS_ON(&thread_checker_);
 
     webrtc::VideoSendStream* stream_ RTC_ACCESS_ON(&thread_checker_);
@@ -369,7 +368,7 @@
         webrtc::Call* call,
         const StreamParams& sp,
         webrtc::VideoReceiveStream::Config config,
-        const DecoderFactoryAdapter* decoder_factory,
+        DecoderFactoryAdapter* decoder_factory,
         bool default_stream,
         const std::vector<VideoCodecSettings>& recv_codecs,
         const webrtc::FlexfecReceiveStream::Config& flexfec_config);
@@ -430,7 +429,7 @@
     webrtc::FlexfecReceiveStream::Config flexfec_config_;
     webrtc::FlexfecReceiveStream* flexfec_stream_;
 
-    const DecoderFactoryAdapter* decoder_factory_;
+    DecoderFactoryAdapter* decoder_factory_;
     DecoderMap allocated_decoders_;
 
     rtc::CriticalSection sink_lock_;
@@ -494,8 +493,8 @@
   rtc::Optional<VideoCodecSettings> send_codec_;
   rtc::Optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_;
 
-  const EncoderFactoryAdapter* const encoder_factory_;
-  const DecoderFactoryAdapter* const decoder_factory_;
+  webrtc::VideoEncoderFactory* const encoder_factory_;
+  DecoderFactoryAdapter* const decoder_factory_;
   std::vector<VideoCodecSettings> recv_codecs_;
   std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
   // See reason for keeping track of the FlexFEC payload type separately in