| Index: webrtc/media/engine/webrtcvideoengine.cc | 
| diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc | 
| index a21f63359dafef87d3e43d26e18a72ed614279ca..26b9397f3b52c4c146486e16ee29af0d32e56756 100644 | 
| --- a/webrtc/media/engine/webrtcvideoengine.cc | 
| +++ b/webrtc/media/engine/webrtcvideoengine.cc | 
| @@ -17,8 +17,11 @@ | 
| #include <utility> | 
|  | 
| #include "webrtc/api/video/i420_buffer.h" | 
| +#include "webrtc/api/video_codecs/sdp_video_format.h" | 
| #include "webrtc/api/video_codecs/video_decoder.h" | 
| +#include "webrtc/api/video_codecs/video_decoder_factory.h" | 
| #include "webrtc/api/video_codecs/video_encoder.h" | 
| +#include "webrtc/api/video_codecs/video_encoder_factory.h" | 
| #include "webrtc/call/call.h" | 
| #include "webrtc/common_video/h264/profile_level_id.h" | 
| #include "webrtc/media/engine/constants.h" | 
| @@ -86,8 +89,8 @@ std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs( | 
|  | 
| // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter | 
| // interface. | 
| -// TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory | 
| -// interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925. | 
| +// TODO(magjed): Remove once WebRtcVideoEncoderFactory* is deprecated and | 
| +// webrtc:7925 is fixed. | 
| class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter { | 
| public: | 
| explicit CricketEncoderFactoryAdapter( | 
| @@ -130,6 +133,66 @@ class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter { | 
| WebRtcVideoDecoderFactory* const external_decoder_factory_; | 
| }; | 
|  | 
| +// Wraps webrtc::VideoEncoderFactory into common EncoderFactoryAdapter | 
| +// interface. | 
| +class WebRtcEncoderFactoryAdapter : public EncoderFactoryAdapter { | 
| + public: | 
| +  explicit WebRtcEncoderFactoryAdapter( | 
| +      std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory) | 
| +      : encoder_factory_(std::move(encoder_factory)) {} | 
| + | 
| + private: | 
| +  AllocatedEncoder CreateVideoEncoder( | 
| +      const VideoCodec& codec, | 
| +      bool is_conference_mode_screenshare) const override { | 
| +    if (!encoder_factory_) | 
| +      return AllocatedEncoder(); | 
| +    const webrtc::SdpVideoFormat format(codec.name, codec.params); | 
| +    const webrtc::VideoEncoderFactory::CodecInfo info = | 
| +        encoder_factory_->QueryVideoEncoder(format); | 
| +    return AllocatedEncoder(encoder_factory_->CreateVideoEncoder(format), | 
| +                            info.is_hardware_accelerated, | 
| +                            info.has_internal_source); | 
| +  } | 
| + | 
| +  std::vector<VideoCodec> GetSupportedCodecs() const override { | 
| +    if (!encoder_factory_) | 
| +      return std::vector<VideoCodec>(); | 
| +    std::vector<VideoCodec> codecs; | 
| +    for (const webrtc::SdpVideoFormat& format : | 
| +         encoder_factory_->GetSupportedFormats()) { | 
| +      VideoCodec codec; | 
| +      codec.name = format.name; | 
| +      codec.params = format.parameters; | 
| +      codecs.push_back(codec); | 
| +    } | 
| +    return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs); | 
| +  } | 
| + | 
| +  std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_; | 
| +}; | 
| + | 
| +// Wraps webrtc::VideoDecoderFactory into common DecoderFactoryAdapter | 
| +// interface. | 
| +class WebRtcDecoderFactoryAdapter : public DecoderFactoryAdapter { | 
| + public: | 
| +  explicit WebRtcDecoderFactoryAdapter( | 
| +      std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory) | 
| +      : decoder_factory_(std::move(decoder_factory)) {} | 
| + | 
| + private: | 
| +  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( | 
| +      const VideoCodec& codec, | 
| +      const VideoDecoderParams& decoder_params) const override { | 
| +    return decoder_factory_ | 
| +               ? decoder_factory_->CreateVideoDecoder( | 
| +                     webrtc::SdpVideoFormat(codec.name, codec.params)) | 
| +               : nullptr; | 
| +  } | 
| + | 
| +  std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_; | 
| +}; | 
| + | 
| // If this field trial is enabled, we will enable sending FlexFEC and disable | 
| // sending ULPFEC whenever the former has been negotiated in the SDPs. | 
| bool IsFlexfecFieldTrialEnabled() { | 
| @@ -401,6 +464,16 @@ WebRtcVideoEngine::WebRtcVideoEngine( | 
| LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; | 
| } | 
|  | 
| +WebRtcVideoEngine::WebRtcVideoEngine( | 
| +    std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory, | 
| +    std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory) | 
| +    : decoder_factory_( | 
| +          new WebRtcDecoderFactoryAdapter(std::move(video_decoder_factory))), | 
| +      encoder_factory_( | 
| +          new WebRtcEncoderFactoryAdapter(std::move(video_encoder_factory))) { | 
| +  LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; | 
| +} | 
| + | 
| WebRtcVideoEngine::~WebRtcVideoEngine() { | 
| LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; | 
| } | 
|  |