Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Unified Diff: video/video_quality_test.cc

Issue 3019593002: Reland of Add full stack tests for MediaCodec.
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « video/video_quality_test.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « video/video_quality_test.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698