| Index: video/video_quality_test.cc
 | 
| diff --git a/video/video_quality_test.cc b/video/video_quality_test.cc
 | 
| index 16b3f65cd3787c9bb70c32cf404e58c51bb49e61..771fce05236447d7e91cede4f0475a5d28caab8e 100644
 | 
| --- a/video/video_quality_test.cc
 | 
| +++ b/video/video_quality_test.cc
 | 
| @@ -18,10 +18,20 @@
 | 
|  #include <string>
 | 
|  #include <vector>
 | 
|  
 | 
| +#if defined(WEBRTC_ANDROID)
 | 
| +#include "modules/video_coding/codecs/test/android_test_initializer.h"
 | 
| +#include "sdk/android/src/jni/androidmediadecoder_jni.h"
 | 
| +#include "sdk/android/src/jni/androidmediaencoder_jni.h"
 | 
| +#elif defined(WEBRTC_IOS)
 | 
| +#include "modules/video_coding/codecs/test/objc_codec_h264_test.h"
 | 
| +#endif
 | 
| +
 | 
|  #include "api/optional.h"
 | 
|  #include "call/call.h"
 | 
|  #include "common_video/libyuv/include/webrtc_libyuv.h"
 | 
|  #include "logging/rtc_event_log/rtc_event_log.h"
 | 
| +#include "media/engine/internalencoderfactory.h"
 | 
| +#include "media/engine/videoencodersoftwarefallbackwrapper.h"
 | 
|  #include "media/engine/webrtcvideoengine.h"
 | 
|  #include "modules/audio_mixer/audio_mixer_impl.h"
 | 
|  #include "modules/rtp_rtcp/include/rtp_header_parser.h"
 | 
| @@ -1128,35 +1138,6 @@
 | 
|    const int64_t start_ms_;
 | 
|  };
 | 
|  
 | 
| -class Vp8EncoderFactory : public cricket::WebRtcVideoEncoderFactory {
 | 
| - public:
 | 
| -  Vp8EncoderFactory() {
 | 
| -    supported_codecs_.push_back(cricket::VideoCodec("VP8"));
 | 
| -  }
 | 
| -  ~Vp8EncoderFactory() override { RTC_CHECK(live_encoders_.empty()); }
 | 
| -
 | 
| -  const std::vector<cricket::VideoCodec>& supported_codecs() const override {
 | 
| -    return supported_codecs_;
 | 
| -  }
 | 
| -
 | 
| -  VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override {
 | 
| -    VideoEncoder* encoder = VP8Encoder::Create();
 | 
| -    live_encoders_.insert(encoder);
 | 
| -    return encoder;
 | 
| -  }
 | 
| -
 | 
| -  void DestroyVideoEncoder(VideoEncoder* encoder) override {
 | 
| -    auto it = live_encoders_.find(encoder);
 | 
| -    RTC_CHECK(it != live_encoders_.end());
 | 
| -    live_encoders_.erase(it);
 | 
| -    delete encoder;
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  std::vector<cricket::VideoCodec> supported_codecs_;
 | 
| -  std::set<VideoEncoder*> live_encoders_;
 | 
| -};
 | 
| -
 | 
|  VideoQualityTest::VideoQualityTest()
 | 
|      : clock_(Clock::GetRealTimeClock()), receive_logs_(0), send_logs_(0) {
 | 
|    payload_type_map_ = test::CallTest::payload_type_map_;
 | 
| @@ -1169,12 +1150,16 @@
 | 
|    payload_type_map_[kPayloadTypeH264] = webrtc::MediaType::VIDEO;
 | 
|    payload_type_map_[kPayloadTypeVP8] = webrtc::MediaType::VIDEO;
 | 
|    payload_type_map_[kPayloadTypeVP9] = webrtc::MediaType::VIDEO;
 | 
| +
 | 
| +#if defined(WEBRTC_ANDROID)
 | 
| +  InitializeAndroidObjects();
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
|  VideoQualityTest::Params::Params()
 | 
|      : call({false, Call::Config::BitrateConfig(), 0}),
 | 
| -      video({false, 640, 480, 30, 50, 800, 800, false, "VP8", 1, -1, 0, false,
 | 
| -             false, ""}),
 | 
| +      video({false, 640, 480, 30, 50, 800, 800, false, "VP8", false, false, 1,
 | 
| +             -1, 0, false, false, ""}),
 | 
|        audio({false, false, false}),
 | 
|        screenshare({false, false, 10, 0}),
 | 
|        analyzer({"", 0.0, 0.0, 0, "", ""}),
 | 
| @@ -1413,28 +1398,51 @@
 | 
|    size_t num_flexfec_streams = params_.video.flexfec ? 1 : 0;
 | 
|    CreateSendConfig(num_video_streams, 0, num_flexfec_streams, send_transport);
 | 
|  
 | 
| +  if (params_.video.hw_encoder) {
 | 
| +#if defined(WEBRTC_ANDROID)
 | 
| +    video_encoder_factory_.reset(new jni::MediaCodecVideoEncoderFactory());
 | 
| +#elif defined(WEBRTC_IOS)
 | 
| +    video_encoder_factory_ = CreateObjCEncoderFactory();
 | 
| +#else
 | 
| +    RTC_NOTREACHED() << "Only support HW encoder on Android and iOS.";
 | 
| +#endif
 | 
| +  } else {
 | 
| +    video_encoder_factory_.reset(new cricket::InternalEncoderFactory());
 | 
| +  }
 | 
| +
 | 
| +  cricket::VideoCodec codec;
 | 
|    int payload_type;
 | 
|    if (params_.video.codec == "H264") {
 | 
| -    video_encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264")));
 | 
| +    // TODO(brandtr): Add support for high profile here.
 | 
| +    codec = cricket::VideoCodec(cricket::kH264CodecName);
 | 
| +    video_encoder_.reset(video_encoder_factory_->CreateVideoEncoder(codec));
 | 
|      payload_type = kPayloadTypeH264;
 | 
|    } else if (params_.video.codec == "VP8") {
 | 
| +    codec = cricket::VideoCodec(cricket::kVp8CodecName);
 | 
|      if (params_.screenshare.enabled && params_.ss.streams.size() > 1) {
 | 
| -      // Simulcast screenshare needs a simulcast encoder adapter to work, since
 | 
| -      // encoders usually can't natively do simulcast with different frame rates
 | 
| -      // for the different layers.
 | 
| +      // Simulcast screenshare needs a simulcast encoder adapter to work,
 | 
| +      // since encoders usually can't natively do simulcast with
 | 
| +      // different frame rates for the different layers.
 | 
|        video_encoder_.reset(
 | 
| -          new SimulcastEncoderAdapter(new Vp8EncoderFactory()));
 | 
| +          new SimulcastEncoderAdapter(video_encoder_factory_.get()));
 | 
|      } else {
 | 
| -      video_encoder_.reset(VP8Encoder::Create());
 | 
| +      video_encoder_.reset(video_encoder_factory_->CreateVideoEncoder(codec));
 | 
|      }
 | 
|      payload_type = kPayloadTypeVP8;
 | 
|    } else if (params_.video.codec == "VP9") {
 | 
| -    video_encoder_.reset(VP9Encoder::Create());
 | 
| +    codec = cricket::VideoCodec(cricket::kVp9CodecName);
 | 
| +    video_encoder_.reset(video_encoder_factory_->CreateVideoEncoder(codec));
 | 
|      payload_type = kPayloadTypeVP9;
 | 
|    } else {
 | 
|      RTC_NOTREACHED() << "Codec not supported!";
 | 
|      return;
 | 
|    }
 | 
| +
 | 
| +  if (params_.video.sw_fallback_encoder) {
 | 
| +    video_encoder_ = rtc::MakeUnique<VideoEncoderSoftwareFallbackWrapper>(
 | 
| +        codec, std::move(video_encoder_));
 | 
| +  }
 | 
| +
 | 
|    video_send_config_.encoder_settings.encoder = video_encoder_.get();
 | 
|    video_send_config_.encoder_settings.payload_name = params_.video.codec;
 | 
|    video_send_config_.encoder_settings.payload_type = payload_type;
 | 
| @@ -1968,7 +1976,7 @@
 | 
|             {"OPUS", 48000, 2,
 | 
|              {{"usedtx", (params_.audio.dtx ? "1" : "0")},
 | 
|                {"stereo", "1"}}}});
 | 
| -  audio_send_config_.encoder_factory = encoder_factory_;
 | 
| +  audio_send_config_.encoder_factory = audio_encoder_factory_;
 | 
|    audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_);
 | 
|  
 | 
|    AudioReceiveStream::Config audio_config;
 | 
| @@ -1978,7 +1986,7 @@
 | 
|    audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc;
 | 
|    audio_config.rtp.transport_cc = params_.call.send_side_bwe;
 | 
|    audio_config.rtp.extensions = audio_send_config_.rtp.extensions;
 | 
| -  audio_config.decoder_factory = decoder_factory_;
 | 
| +  audio_config.decoder_factory = audio_decoder_factory_;
 | 
|    audio_config.decoder_map = {{kAudioSendPayloadType, {"OPUS", 48000, 2}}};
 | 
|    if (params_.video.enabled && params_.audio.sync_video)
 | 
|      audio_config.sync_group = kSyncGroup;
 | 
| @@ -2008,7 +2016,7 @@
 | 
|          webrtc::AudioProcessing::Create());
 | 
|  
 | 
|      if (params_.audio.enabled) {
 | 
| -      CreateVoiceEngine(&voe, audio_processing.get(), decoder_factory_);
 | 
| +      CreateVoiceEngine(&voe, audio_processing.get(), audio_decoder_factory_);
 | 
|        AudioState::Config audio_state_config;
 | 
|        audio_state_config.voice_engine = voe.voice_engine;
 | 
|        audio_state_config.audio_mixer = AudioMixerImpl::Create();
 | 
| 
 |