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

Side by Side Diff: webrtc/media/engine/webrtcvideoengine_unittest.cc

Issue 3008043002: Simplify passing video codec factories in media engine (Closed)
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 unified diff | Download patch
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 140
141 } // namespace 141 } // namespace
142 142
143 namespace cricket { 143 namespace cricket {
144 class WebRtcVideoEngineTest : public ::testing::Test { 144 class WebRtcVideoEngineTest : public ::testing::Test {
145 public: 145 public:
146 WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {} 146 WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {}
147 explicit WebRtcVideoEngineTest(const char* field_trials) 147 explicit WebRtcVideoEngineTest(const char* field_trials)
148 : override_field_trials_(field_trials), 148 : override_field_trials_(field_trials),
149 call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))), 149 call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))),
150 engine_() { 150 engine_(&encoder_factory_, &decoder_factory_) {
151 std::vector<VideoCodec> engine_codecs = engine_.codecs(); 151 std::vector<VideoCodec> engine_codecs = engine_.codecs();
152 RTC_DCHECK(!engine_codecs.empty()); 152 RTC_DCHECK(!engine_codecs.empty());
153 bool codec_set = false; 153 bool codec_set = false;
154 for (const cricket::VideoCodec& codec : engine_codecs) { 154 for (const cricket::VideoCodec& codec : engine_codecs) {
155 if (codec.name == "rtx") { 155 if (codec.name == "rtx") {
156 int associated_payload_type; 156 int associated_payload_type;
157 if (codec.GetParam(kCodecParamAssociatedPayloadType, 157 if (codec.GetParam(kCodecParamAssociatedPayloadType,
158 &associated_payload_type)) { 158 &associated_payload_type)) {
159 default_apt_rtx_types_[associated_payload_type] = codec.id; 159 default_apt_rtx_types_[associated_payload_type] = codec.id;
160 } 160 }
161 } else if (!codec_set && codec.name != "red" && codec.name != "ulpfec") { 161 } else if (!codec_set && codec.name != "red" && codec.name != "ulpfec") {
162 default_codec_ = codec; 162 default_codec_ = codec;
163 codec_set = true; 163 codec_set = true;
164 } 164 }
165 } 165 }
166 166
167 RTC_DCHECK(codec_set); 167 RTC_DCHECK(codec_set);
168 } 168 }
169 169
170 protected: 170 protected:
171 // Find the codec in the engine with the given name. The codec must be 171 // Find the codec in the engine with the given name. The codec must be
172 // present. 172 // present.
173 cricket::VideoCodec GetEngineCodec(const std::string& name); 173 cricket::VideoCodec GetEngineCodec(const std::string& name);
174 174
175 VideoMediaChannel* SetUpForExternalEncoderFactory( 175 VideoMediaChannel* SetUpForExternalEncoderFactory();
176 cricket::WebRtcVideoEncoderFactory* encoder_factory);
177 176
178 VideoMediaChannel* SetUpForExternalDecoderFactory( 177 VideoMediaChannel* SetUpForExternalDecoderFactory(
179 cricket::WebRtcVideoDecoderFactory* decoder_factory,
180 const std::vector<VideoCodec>& codecs); 178 const std::vector<VideoCodec>& codecs);
181 179
182 void TestExtendedEncoderOveruse(bool use_external_encoder); 180 void TestExtendedEncoderOveruse(bool use_external_encoder);
183 181
184 webrtc::test::ScopedFieldTrials override_field_trials_; 182 webrtc::test::ScopedFieldTrials override_field_trials_;
185 webrtc::RtcEventLogNullImpl event_log_; 183 webrtc::RtcEventLogNullImpl event_log_;
186 // Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly 184 // Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly
187 // initialized when the constructor is called. 185 // initialized when the constructor is called.
188 std::unique_ptr<webrtc::Call> call_; 186 std::unique_ptr<webrtc::Call> call_;
187 cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
188 cricket::FakeWebRtcVideoDecoderFactory decoder_factory_;
189 WebRtcVideoEngine engine_; 189 WebRtcVideoEngine engine_;
190 VideoCodec default_codec_; 190 VideoCodec default_codec_;
191 std::map<int, int> default_apt_rtx_types_; 191 std::map<int, int> default_apt_rtx_types_;
192 }; 192 };
193 193
194 TEST_F(WebRtcVideoEngineTest, AnnouncesVp9AccordingToBuildFlags) { 194 TEST_F(WebRtcVideoEngineTest, AnnouncesVp9AccordingToBuildFlags) {
195 bool claims_vp9_support = false; 195 bool claims_vp9_support = false;
196 for (const cricket::VideoCodec& codec : engine_.codecs()) { 196 for (const cricket::VideoCodec& codec : engine_.codecs()) {
197 if (codec.name == "VP9") { 197 if (codec.name == "VP9") {
198 claims_vp9_support = true; 198 claims_vp9_support = true;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 } 266 }
267 } 267 }
268 FAIL() << "Video Rotation extension not in header-extension list."; 268 FAIL() << "Video Rotation extension not in header-extension list.";
269 } 269 }
270 270
271 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) { 271 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) {
272 // Allocate the capturer first to prevent early destruction before channel's 272 // Allocate the capturer first to prevent early destruction before channel's
273 // dtor is called. 273 // dtor is called.
274 cricket::FakeVideoCapturer capturer; 274 cricket::FakeVideoCapturer capturer;
275 275
276 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 276 encoder_factory_.AddSupportedVideoCodecType("VP8");
277 encoder_factory.AddSupportedVideoCodecType("VP8");
278 277
279 std::unique_ptr<VideoMediaChannel> channel( 278 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
280 SetUpForExternalEncoderFactory(&encoder_factory));
281 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 279 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
282 280
283 // Add CVO extension. 281 // Add CVO extension.
284 const int id = 1; 282 const int id = 1;
285 cricket::VideoSendParameters parameters; 283 cricket::VideoSendParameters parameters;
286 parameters.codecs.push_back(GetEngineCodec("VP8")); 284 parameters.codecs.push_back(GetEngineCodec("VP8"));
287 parameters.extensions.push_back( 285 parameters.extensions.push_back(
288 RtpExtension(RtpExtension::kVideoRotationUri, id)); 286 RtpExtension(RtpExtension::kVideoRotationUri, id));
289 EXPECT_TRUE(channel->SetSendParameters(parameters)); 287 EXPECT_TRUE(channel->SetSendParameters(parameters));
290 288
291 // Set capturer. 289 // Set capturer.
292 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); 290 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
293 291
294 // Verify capturer has turned off applying rotation. 292 // Verify capturer has turned off applying rotation.
295 EXPECT_FALSE(capturer.apply_rotation()); 293 EXPECT_FALSE(capturer.apply_rotation());
296 294
297 // Verify removing header extension turns on applying rotation. 295 // Verify removing header extension turns on applying rotation.
298 parameters.extensions.clear(); 296 parameters.extensions.clear();
299 EXPECT_TRUE(channel->SetSendParameters(parameters)); 297 EXPECT_TRUE(channel->SetSendParameters(parameters));
300 EXPECT_TRUE(capturer.apply_rotation()); 298 EXPECT_TRUE(capturer.apply_rotation());
301 } 299 }
302 300
303 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) { 301 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) {
304 // Allocate the capturer first to prevent early destruction before channel's 302 // Allocate the capturer first to prevent early destruction before channel's
305 // dtor is called. 303 // dtor is called.
306 cricket::FakeVideoCapturer capturer; 304 cricket::FakeVideoCapturer capturer;
307 305
308 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 306 encoder_factory_.AddSupportedVideoCodecType("VP8");
309 encoder_factory.AddSupportedVideoCodecType("VP8");
310 307
311 std::unique_ptr<VideoMediaChannel> channel( 308 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
312 SetUpForExternalEncoderFactory(&encoder_factory));
313 // Add CVO extension. 309 // Add CVO extension.
314 const int id = 1; 310 const int id = 1;
315 cricket::VideoSendParameters parameters; 311 cricket::VideoSendParameters parameters;
316 parameters.codecs.push_back(GetEngineCodec("VP8")); 312 parameters.codecs.push_back(GetEngineCodec("VP8"));
317 parameters.extensions.push_back( 313 parameters.extensions.push_back(
318 RtpExtension(RtpExtension::kVideoRotationUri, id)); 314 RtpExtension(RtpExtension::kVideoRotationUri, id));
319 EXPECT_TRUE(channel->SetSendParameters(parameters)); 315 EXPECT_TRUE(channel->SetSendParameters(parameters));
320 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 316 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
321 317
322 // Set capturer. 318 // Set capturer.
323 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); 319 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
324 320
325 // Verify capturer has turned off applying rotation. 321 // Verify capturer has turned off applying rotation.
326 EXPECT_FALSE(capturer.apply_rotation()); 322 EXPECT_FALSE(capturer.apply_rotation());
327 } 323 }
328 324
329 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) { 325 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) {
330 cricket::FakeVideoCapturer capturer; 326 cricket::FakeVideoCapturer capturer;
331 327
332 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 328 encoder_factory_.AddSupportedVideoCodecType("VP8");
333 encoder_factory.AddSupportedVideoCodecType("VP8"); 329 encoder_factory_.AddSupportedVideoCodecType("VP9");
334 encoder_factory.AddSupportedVideoCodecType("VP9");
335 330
336 std::unique_ptr<VideoMediaChannel> channel( 331 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
337 SetUpForExternalEncoderFactory(&encoder_factory));
338 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 332 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
339 333
340 // Set capturer. 334 // Set capturer.
341 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); 335 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
342 336
343 // Verify capturer has turned on applying rotation. 337 // Verify capturer has turned on applying rotation.
344 EXPECT_TRUE(capturer.apply_rotation()); 338 EXPECT_TRUE(capturer.apply_rotation());
345 339
346 // Add CVO extension. 340 // Add CVO extension.
347 const int id = 1; 341 const int id = 1;
348 cricket::VideoSendParameters parameters; 342 cricket::VideoSendParameters parameters;
349 parameters.codecs.push_back(GetEngineCodec("VP8")); 343 parameters.codecs.push_back(GetEngineCodec("VP8"));
350 parameters.codecs.push_back(GetEngineCodec("VP9")); 344 parameters.codecs.push_back(GetEngineCodec("VP9"));
351 parameters.extensions.push_back( 345 parameters.extensions.push_back(
352 RtpExtension(RtpExtension::kVideoRotationUri, id)); 346 RtpExtension(RtpExtension::kVideoRotationUri, id));
353 // Also remove the first codec to trigger a codec change as well. 347 // Also remove the first codec to trigger a codec change as well.
354 parameters.codecs.erase(parameters.codecs.begin()); 348 parameters.codecs.erase(parameters.codecs.begin());
355 EXPECT_TRUE(channel->SetSendParameters(parameters)); 349 EXPECT_TRUE(channel->SetSendParameters(parameters));
356 350
357 // Verify capturer has turned off applying rotation. 351 // Verify capturer has turned off applying rotation.
358 EXPECT_FALSE(capturer.apply_rotation()); 352 EXPECT_FALSE(capturer.apply_rotation());
359 353
360 // Verify removing header extension turns on applying rotation. 354 // Verify removing header extension turns on applying rotation.
361 parameters.extensions.clear(); 355 parameters.extensions.clear();
362 EXPECT_TRUE(channel->SetSendParameters(parameters)); 356 EXPECT_TRUE(channel->SetSendParameters(parameters));
363 EXPECT_TRUE(capturer.apply_rotation()); 357 EXPECT_TRUE(capturer.apply_rotation());
364 } 358 }
365 359
366 TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) { 360 TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) {
367 engine_.Init();
368 std::unique_ptr<VideoMediaChannel> channel( 361 std::unique_ptr<VideoMediaChannel> channel(
369 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); 362 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
370 363
371 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123))); 364 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
372 365
373 EXPECT_FALSE(channel->SetSend(true)) 366 EXPECT_FALSE(channel->SetSend(true))
374 << "Channel should not start without codecs."; 367 << "Channel should not start without codecs.";
375 EXPECT_TRUE(channel->SetSend(false)) 368 EXPECT_TRUE(channel->SetSend(false))
376 << "Channel should be stoppable even without set codecs."; 369 << "Channel should be stoppable even without set codecs.";
377 } 370 }
378 371
379 TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) { 372 TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) {
380 engine_.Init();
381 std::unique_ptr<VideoMediaChannel> channel( 373 std::unique_ptr<VideoMediaChannel> channel(
382 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); 374 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
383 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123))); 375 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
384 VideoMediaInfo info; 376 VideoMediaInfo info;
385 channel->GetStats(&info); 377 channel->GetStats(&info);
386 } 378 }
387 379
388 TEST_F(WebRtcVideoEngineTest, UseExternalFactoryForVp8WhenSupported) { 380 TEST_F(WebRtcVideoEngineTest, UseExternalFactoryForVp8WhenSupported) {
389 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 381 encoder_factory_.AddSupportedVideoCodecType("VP8");
390 encoder_factory.AddSupportedVideoCodecType("VP8");
391 382
392 std::unique_ptr<VideoMediaChannel> channel( 383 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
393 SetUpForExternalEncoderFactory(&encoder_factory));
394 channel->OnReadyToSend(true); 384 channel->OnReadyToSend(true);
395 385
396 EXPECT_TRUE( 386 EXPECT_TRUE(
397 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 387 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
398 EXPECT_EQ(0, encoder_factory.GetNumCreatedEncoders()); 388 EXPECT_EQ(0, encoder_factory_.GetNumCreatedEncoders());
399 EXPECT_TRUE(channel->SetSend(true)); 389 EXPECT_TRUE(channel->SetSend(true));
400 cricket::FakeVideoCapturer capturer; 390 cricket::FakeVideoCapturer capturer;
401 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); 391 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
402 EXPECT_EQ(cricket::CS_RUNNING, 392 EXPECT_EQ(cricket::CS_RUNNING,
403 capturer.Start(capturer.GetSupportedFormats()->front())); 393 capturer.Start(capturer.GetSupportedFormats()->front()));
404 EXPECT_TRUE(capturer.CaptureFrame()); 394 EXPECT_TRUE(capturer.CaptureFrame());
405 // Sending one frame will have allocate the encoder. 395 // Sending one frame will have allocate the encoder.
406 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); 396 ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(1));
407 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0, 397 EXPECT_TRUE_WAIT(encoder_factory_.encoders()[0]->GetNumEncodedFrames() > 0,
408 kTimeout); 398 kTimeout);
409 399
410 int num_created_encoders = encoder_factory.GetNumCreatedEncoders(); 400 int num_created_encoders = encoder_factory_.GetNumCreatedEncoders();
411 EXPECT_EQ(num_created_encoders, 1); 401 EXPECT_EQ(num_created_encoders, 1);
412 402
413 // Setting codecs of the same type should not reallocate any encoders 403 // Setting codecs of the same type should not reallocate any encoders
414 // (expecting a no-op). 404 // (expecting a no-op).
415 cricket::VideoSendParameters parameters; 405 cricket::VideoSendParameters parameters;
416 parameters.codecs.push_back(GetEngineCodec("VP8")); 406 parameters.codecs.push_back(GetEngineCodec("VP8"));
417 EXPECT_TRUE(channel->SetSendParameters(parameters)); 407 EXPECT_TRUE(channel->SetSendParameters(parameters));
418 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders()); 408 EXPECT_EQ(num_created_encoders, encoder_factory_.GetNumCreatedEncoders());
419 409
420 // Remove stream previously added to free the external encoder instance. 410 // Remove stream previously added to free the external encoder instance.
421 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); 411 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
422 EXPECT_EQ(0u, encoder_factory.encoders().size()); 412 EXPECT_EQ(0u, encoder_factory_.encoders().size());
423 } 413 }
424 414
425 // Test that when an external encoder factory supports a codec we don't 415 // Test that when an external encoder factory supports a codec we don't
426 // internally support, we still add an RTX codec for it. 416 // internally support, we still add an RTX codec for it.
427 // TODO(deadbeef): Currently this test is only effective if WebRTC is 417 // TODO(deadbeef): Currently this test is only effective if WebRTC is
428 // built with no internal H264 support. This test should be updated 418 // built with no internal H264 support. This test should be updated
429 // if/when we start adding RTX codecs for unrecognized codec names. 419 // if/when we start adding RTX codecs for unrecognized codec names.
430 TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForExternalCodec) { 420 TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForExternalCodec) {
431 using webrtc::H264::ProfileLevelIdToString; 421 using webrtc::H264::ProfileLevelIdToString;
432 using webrtc::H264::ProfileLevelId; 422 using webrtc::H264::ProfileLevelId;
433 using webrtc::H264::kLevel1; 423 using webrtc::H264::kLevel1;
434 cricket::VideoCodec h264_constrained_baseline("H264"); 424 cricket::VideoCodec h264_constrained_baseline("H264");
435 h264_constrained_baseline.params[kH264FmtpProfileLevelId] = 425 h264_constrained_baseline.params[kH264FmtpProfileLevelId] =
436 *ProfileLevelIdToString( 426 *ProfileLevelIdToString(
437 ProfileLevelId(webrtc::H264::kProfileConstrainedBaseline, kLevel1)); 427 ProfileLevelId(webrtc::H264::kProfileConstrainedBaseline, kLevel1));
438 cricket::VideoCodec h264_constrained_high("H264"); 428 cricket::VideoCodec h264_constrained_high("H264");
439 h264_constrained_high.params[kH264FmtpProfileLevelId] = 429 h264_constrained_high.params[kH264FmtpProfileLevelId] =
440 *ProfileLevelIdToString( 430 *ProfileLevelIdToString(
441 ProfileLevelId(webrtc::H264::kProfileConstrainedHigh, kLevel1)); 431 ProfileLevelId(webrtc::H264::kProfileConstrainedHigh, kLevel1));
442 cricket::VideoCodec h264_high("H264"); 432 cricket::VideoCodec h264_high("H264");
443 h264_high.params[kH264FmtpProfileLevelId] = *ProfileLevelIdToString( 433 h264_high.params[kH264FmtpProfileLevelId] = *ProfileLevelIdToString(
444 ProfileLevelId(webrtc::H264::kProfileHigh, kLevel1)); 434 ProfileLevelId(webrtc::H264::kProfileHigh, kLevel1));
445 435
446 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 436 encoder_factory_.AddSupportedVideoCodec(h264_constrained_baseline);
447 encoder_factory.AddSupportedVideoCodec(h264_constrained_baseline); 437 encoder_factory_.AddSupportedVideoCodec(h264_constrained_high);
448 encoder_factory.AddSupportedVideoCodec(h264_constrained_high); 438 encoder_factory_.AddSupportedVideoCodec(h264_high);
449 encoder_factory.AddSupportedVideoCodec(h264_high);
450 engine_.SetExternalEncoderFactory(&encoder_factory);
451 engine_.Init();
452 439
453 // First figure out what payload types the test codecs got assigned. 440 // First figure out what payload types the test codecs got assigned.
454 const std::vector<cricket::VideoCodec> codecs = engine_.codecs(); 441 const std::vector<cricket::VideoCodec> codecs = engine_.codecs();
455 // Now search for RTX codecs for them. Expect that they all have associated 442 // Now search for RTX codecs for them. Expect that they all have associated
456 // RTX codecs. 443 // RTX codecs.
457 EXPECT_TRUE(HasRtxCodec( 444 EXPECT_TRUE(HasRtxCodec(
458 codecs, FindMatchingCodec(codecs, h264_constrained_baseline)->id)); 445 codecs, FindMatchingCodec(codecs, h264_constrained_baseline)->id));
459 EXPECT_TRUE(HasRtxCodec( 446 EXPECT_TRUE(HasRtxCodec(
460 codecs, FindMatchingCodec(codecs, h264_constrained_high)->id)); 447 codecs, FindMatchingCodec(codecs, h264_constrained_high)->id));
461 EXPECT_TRUE(HasRtxCodec( 448 EXPECT_TRUE(HasRtxCodec(
462 codecs, FindMatchingCodec(codecs, h264_high)->id)); 449 codecs, FindMatchingCodec(codecs, h264_high)->id));
463 } 450 }
464 451
465 void WebRtcVideoEngineTest::TestExtendedEncoderOveruse( 452 void WebRtcVideoEngineTest::TestExtendedEncoderOveruse(
466 bool use_external_encoder) { 453 bool use_external_encoder) {
467 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
468 encoder_factory.AddSupportedVideoCodecType("VP8");
469 std::unique_ptr<VideoMediaChannel> channel; 454 std::unique_ptr<VideoMediaChannel> channel;
470 FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_)); 455 FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_));
471 call_.reset(fake_call); 456 call_.reset(fake_call);
472 if (use_external_encoder) { 457 if (use_external_encoder) {
473 channel.reset(SetUpForExternalEncoderFactory(&encoder_factory)); 458 encoder_factory_.AddSupportedVideoCodecType("VP8");
459 channel.reset(SetUpForExternalEncoderFactory());
474 } else { 460 } else {
475 engine_.Init();
476 channel.reset( 461 channel.reset(
477 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); 462 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
478 } 463 }
479 ASSERT_TRUE( 464 ASSERT_TRUE(
480 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 465 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
481 cricket::VideoSendParameters parameters; 466 cricket::VideoSendParameters parameters;
482 parameters.codecs.push_back(GetEngineCodec("VP8")); 467 parameters.codecs.push_back(GetEngineCodec("VP8"));
483 EXPECT_TRUE(channel->SetSendParameters(parameters)); 468 EXPECT_TRUE(channel->SetSendParameters(parameters));
484 EXPECT_TRUE(channel->SetSend(true)); 469 EXPECT_TRUE(channel->SetSend(true));
485 FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0]; 470 FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
486 471
487 EXPECT_EQ(use_external_encoder, 472 EXPECT_EQ(use_external_encoder,
488 stream->GetConfig().encoder_settings.full_overuse_time); 473 stream->GetConfig().encoder_settings.full_overuse_time);
489 // Remove stream previously added to free the external encoder instance. 474 // Remove stream previously added to free the external encoder instance.
490 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); 475 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
491 } 476 }
492 477
493 TEST_F(WebRtcVideoEngineTest, EnablesFullEncoderTimeForExternalEncoders) { 478 TEST_F(WebRtcVideoEngineTest, EnablesFullEncoderTimeForExternalEncoders) {
494 TestExtendedEncoderOveruse(true); 479 TestExtendedEncoderOveruse(true);
495 } 480 }
496 481
497 TEST_F(WebRtcVideoEngineTest, DisablesFullEncoderTimeForNonExternalEncoders) { 482 TEST_F(WebRtcVideoEngineTest, DisablesFullEncoderTimeForNonExternalEncoders) {
498 TestExtendedEncoderOveruse(false); 483 TestExtendedEncoderOveruse(false);
499 } 484 }
500 485
501 #if !defined(RTC_DISABLE_VP9) 486 #if !defined(RTC_DISABLE_VP9)
502 TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) { 487 TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) {
503 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 488 encoder_factory_.AddSupportedVideoCodecType("VP9");
504 encoder_factory.AddSupportedVideoCodecType("VP9");
505 489
506 std::unique_ptr<VideoMediaChannel> channel( 490 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
507 SetUpForExternalEncoderFactory(&encoder_factory));
508 491
509 EXPECT_TRUE( 492 EXPECT_TRUE(
510 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc))); 493 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
511 } 494 }
512 #endif // !defined(RTC_DISABLE_VP9) 495 #endif // !defined(RTC_DISABLE_VP9)
513 496
514 TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) { 497 TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) {
515 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 498 encoder_factory_.AddSupportedVideoCodecType("VP8");
516 encoder_factory.AddSupportedVideoCodecType("VP8");
517 FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_)); 499 FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_));
518 call_.reset(fake_call); 500 call_.reset(fake_call);
519 std::unique_ptr<VideoMediaChannel> channel( 501 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
520 SetUpForExternalEncoderFactory(&encoder_factory));
521 502
522 EXPECT_TRUE( 503 EXPECT_TRUE(
523 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 504 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
524 505
525 FakeVideoCapturer capturer; 506 FakeVideoCapturer capturer;
526 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); 507 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
527 capturer.Start(cricket::VideoFormat(1280, 720, 508 capturer.Start(cricket::VideoFormat(1280, 720,
528 cricket::VideoFormat::FpsToInterval(60), 509 cricket::VideoFormat::FpsToInterval(60),
529 cricket::FOURCC_I420)); 510 cricket::FOURCC_I420));
530 channel->SetSend(true); 511 channel->SetSend(true);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 const std::string& name) { 552 const std::string& name) {
572 for (const cricket::VideoCodec& engine_codec : engine_.codecs()) { 553 for (const cricket::VideoCodec& engine_codec : engine_.codecs()) {
573 if (CodecNamesEq(name, engine_codec.name)) 554 if (CodecNamesEq(name, engine_codec.name))
574 return engine_codec; 555 return engine_codec;
575 } 556 }
576 // This point should never be reached. 557 // This point should never be reached.
577 ADD_FAILURE() << "Unrecognized codec name: " << name; 558 ADD_FAILURE() << "Unrecognized codec name: " << name;
578 return cricket::VideoCodec(); 559 return cricket::VideoCodec();
579 } 560 }
580 561
581 VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalEncoderFactory( 562 VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalEncoderFactory() {
582 cricket::WebRtcVideoEncoderFactory* encoder_factory) {
583 engine_.SetExternalEncoderFactory(encoder_factory);
584 engine_.Init();
585
586 VideoMediaChannel* channel = 563 VideoMediaChannel* channel =
587 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()); 564 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions());
588 cricket::VideoSendParameters parameters; 565 cricket::VideoSendParameters parameters;
589 // We need to look up the codec in the engine to get the correct payload type. 566 // We need to look up the codec in the engine to get the correct payload type.
590 for (const VideoCodec& codec : encoder_factory->supported_codecs()) 567 for (const VideoCodec& codec : encoder_factory_.supported_codecs())
591 parameters.codecs.push_back(GetEngineCodec(codec.name)); 568 parameters.codecs.push_back(GetEngineCodec(codec.name));
592 569
593 EXPECT_TRUE(channel->SetSendParameters(parameters)); 570 EXPECT_TRUE(channel->SetSendParameters(parameters));
594 571
595 return channel; 572 return channel;
596 } 573 }
597 574
598 VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalDecoderFactory( 575 VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalDecoderFactory(
599 cricket::WebRtcVideoDecoderFactory* decoder_factory,
600 const std::vector<VideoCodec>& codecs) { 576 const std::vector<VideoCodec>& codecs) {
601 engine_.SetExternalDecoderFactory(decoder_factory);
602 engine_.Init();
603
604 VideoMediaChannel* channel = 577 VideoMediaChannel* channel =
605 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()); 578 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions());
606 cricket::VideoRecvParameters parameters; 579 cricket::VideoRecvParameters parameters;
607 parameters.codecs = codecs; 580 parameters.codecs = codecs;
608 EXPECT_TRUE(channel->SetRecvParameters(parameters)); 581 EXPECT_TRUE(channel->SetRecvParameters(parameters));
609 582
610 return channel; 583 return channel;
611 } 584 }
612 585
613 TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { 586 TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) {
614 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 587 encoder_factory_.AddSupportedVideoCodecType("VP8");
615 encoder_factory.AddSupportedVideoCodecType("VP8");
616 588
617 std::unique_ptr<VideoMediaChannel> channel( 589 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
618 SetUpForExternalEncoderFactory(&encoder_factory));
619 590
620 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 591 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
621 592
622 EXPECT_TRUE( 593 EXPECT_TRUE(
623 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); 594 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
624 EXPECT_TRUE(channel->SetSend(true)); 595 EXPECT_TRUE(channel->SetSend(true));
625 596
626 cricket::FakeVideoCapturer capturer; 597 cricket::FakeVideoCapturer capturer;
627 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer)); 598 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
628 EXPECT_EQ(cricket::CS_RUNNING, 599 EXPECT_EQ(cricket::CS_RUNNING,
629 capturer.Start(capturer.GetSupportedFormats()->front())); 600 capturer.Start(capturer.GetSupportedFormats()->front()));
630 EXPECT_TRUE(capturer.CaptureFrame()); 601 EXPECT_TRUE(capturer.CaptureFrame());
631 602
632 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); 603 ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2));
633 604
634 // Verify that encoders are configured for simulcast through adapter 605 // Verify that encoders are configured for simulcast through adapter
635 // (increasing resolution and only configured to send one stream each). 606 // (increasing resolution and only configured to send one stream each).
636 int prev_width = -1; 607 int prev_width = -1;
637 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { 608 for (size_t i = 0; i < encoder_factory_.encoders().size(); ++i) {
638 ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode()); 609 ASSERT_TRUE(encoder_factory_.encoders()[i]->WaitForInitEncode());
639 webrtc::VideoCodec codec_settings = 610 webrtc::VideoCodec codec_settings =
640 encoder_factory.encoders()[i]->GetCodecSettings(); 611 encoder_factory_.encoders()[i]->GetCodecSettings();
641 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); 612 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
642 EXPECT_GT(codec_settings.width, prev_width); 613 EXPECT_GT(codec_settings.width, prev_width);
643 prev_width = codec_settings.width; 614 prev_width = codec_settings.width;
644 } 615 }
645 616
646 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, nullptr)); 617 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, nullptr));
647 618
648 channel.reset(); 619 channel.reset();
649 ASSERT_EQ(0u, encoder_factory.encoders().size()); 620 ASSERT_EQ(0u, encoder_factory_.encoders().size());
650 } 621 }
651 622
652 TEST_F(WebRtcVideoEngineTest, ChannelWithExternalH264CanChangeToInternalVp8) { 623 TEST_F(WebRtcVideoEngineTest, ChannelWithExternalH264CanChangeToInternalVp8) {
653 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 624 encoder_factory_.AddSupportedVideoCodecType("H264");
654 encoder_factory.AddSupportedVideoCodecType("H264");
655 625
656 std::unique_ptr<VideoMediaChannel> channel( 626 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
657 SetUpForExternalEncoderFactory(&encoder_factory));
658 627
659 EXPECT_TRUE( 628 EXPECT_TRUE(
660 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 629 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
661 ASSERT_EQ(1u, encoder_factory.encoders().size()); 630 ASSERT_EQ(1u, encoder_factory_.encoders().size());
662 631
663 cricket::VideoSendParameters parameters; 632 cricket::VideoSendParameters parameters;
664 parameters.codecs.push_back(GetEngineCodec("VP8")); 633 parameters.codecs.push_back(GetEngineCodec("VP8"));
665 EXPECT_TRUE(channel->SetSendParameters(parameters)); 634 EXPECT_TRUE(channel->SetSendParameters(parameters));
666 ASSERT_EQ(0u, encoder_factory.encoders().size()); 635 ASSERT_EQ(0u, encoder_factory_.encoders().size());
667 } 636 }
668 637
669 TEST_F(WebRtcVideoEngineTest, 638 TEST_F(WebRtcVideoEngineTest,
670 DontUseExternalEncoderFactoryForUnsupportedCodecs) { 639 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
671 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 640 encoder_factory_.AddSupportedVideoCodecType("H264");
672 encoder_factory.AddSupportedVideoCodecType("H264");
673
674 engine_.SetExternalEncoderFactory(&encoder_factory);
675 engine_.Init();
676 641
677 std::unique_ptr<VideoMediaChannel> channel( 642 std::unique_ptr<VideoMediaChannel> channel(
678 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); 643 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
679 cricket::VideoSendParameters parameters; 644 cricket::VideoSendParameters parameters;
680 parameters.codecs.push_back(GetEngineCodec("VP8")); 645 parameters.codecs.push_back(GetEngineCodec("VP8"));
681 EXPECT_TRUE(channel->SetSendParameters(parameters)); 646 EXPECT_TRUE(channel->SetSendParameters(parameters));
682 647
683 EXPECT_TRUE( 648 EXPECT_TRUE(
684 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 649 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
685 // Make sure DestroyVideoEncoder was called on the factory. 650 // Make sure DestroyVideoEncoder was called on the factory.
686 ASSERT_EQ(0u, encoder_factory.encoders().size()); 651 ASSERT_EQ(0u, encoder_factory_.encoders().size());
687 } 652 }
688 653
689 TEST_F(WebRtcVideoEngineTest, 654 TEST_F(WebRtcVideoEngineTest,
690 UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) { 655 UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) {
691 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 656 encoder_factory_.AddSupportedVideoCodecType("VP8");
692 encoder_factory.AddSupportedVideoCodecType("VP8"); 657 encoder_factory_.AddSupportedVideoCodecType("H264");
693 encoder_factory.AddSupportedVideoCodecType("H264");
694
695 engine_.SetExternalEncoderFactory(&encoder_factory);
696 engine_.Init();
697 658
698 std::unique_ptr<VideoMediaChannel> channel( 659 std::unique_ptr<VideoMediaChannel> channel(
699 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); 660 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
700 cricket::VideoSendParameters parameters; 661 cricket::VideoSendParameters parameters;
701 parameters.codecs.push_back(GetEngineCodec("VP8")); 662 parameters.codecs.push_back(GetEngineCodec("VP8"));
702 EXPECT_TRUE(channel->SetSendParameters(parameters)); 663 EXPECT_TRUE(channel->SetSendParameters(parameters));
703 664
704 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 665 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
705 666
706 EXPECT_TRUE( 667 EXPECT_TRUE(
707 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); 668 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
708 EXPECT_TRUE(channel->SetSend(true)); 669 EXPECT_TRUE(channel->SetSend(true));
709 670
710 // Send a fake frame, or else the media engine will configure the simulcast 671 // Send a fake frame, or else the media engine will configure the simulcast
711 // encoder adapter at a low-enough size that it'll only create a single 672 // encoder adapter at a low-enough size that it'll only create a single
712 // encoder layer. 673 // encoder layer.
713 cricket::FakeVideoCapturer capturer; 674 cricket::FakeVideoCapturer capturer;
714 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer)); 675 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
715 EXPECT_EQ(cricket::CS_RUNNING, 676 EXPECT_EQ(cricket::CS_RUNNING,
716 capturer.Start(capturer.GetSupportedFormats()->front())); 677 capturer.Start(capturer.GetSupportedFormats()->front()));
717 EXPECT_TRUE(capturer.CaptureFrame()); 678 EXPECT_TRUE(capturer.CaptureFrame());
718 679
719 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); 680 ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2));
720 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); 681 ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode());
721 EXPECT_EQ(webrtc::kVideoCodecVP8, 682 EXPECT_EQ(webrtc::kVideoCodecVP8,
722 encoder_factory.encoders()[0]->GetCodecSettings().codecType); 683 encoder_factory_.encoders()[0]->GetCodecSettings().codecType);
723 684
724 channel.reset(); 685 channel.reset();
725 // Make sure DestroyVideoEncoder was called on the factory. 686 // Make sure DestroyVideoEncoder was called on the factory.
726 EXPECT_EQ(0u, encoder_factory.encoders().size()); 687 EXPECT_EQ(0u, encoder_factory_.encoders().size());
727 } 688 }
728 689
729 TEST_F(WebRtcVideoEngineTest, 690 TEST_F(WebRtcVideoEngineTest,
730 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { 691 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) {
731 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 692 encoder_factory_.AddSupportedVideoCodecType("VP8");
732 encoder_factory.AddSupportedVideoCodecType("VP8"); 693 encoder_factory_.AddSupportedVideoCodecType("H264");
733 encoder_factory.AddSupportedVideoCodecType("H264");
734
735 engine_.SetExternalEncoderFactory(&encoder_factory);
736 engine_.Init();
737 694
738 std::unique_ptr<VideoMediaChannel> channel( 695 std::unique_ptr<VideoMediaChannel> channel(
739 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); 696 engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
740 cricket::VideoSendParameters parameters; 697 cricket::VideoSendParameters parameters;
741 parameters.codecs.push_back(GetEngineCodec("H264")); 698 parameters.codecs.push_back(GetEngineCodec("H264"));
742 EXPECT_TRUE(channel->SetSendParameters(parameters)); 699 EXPECT_TRUE(channel->SetSendParameters(parameters));
743 700
744 EXPECT_TRUE( 701 EXPECT_TRUE(
745 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 702 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
746 ASSERT_EQ(1u, encoder_factory.encoders().size()); 703 ASSERT_EQ(1u, encoder_factory_.encoders().size());
747 704
748 // Send a frame of 720p. This should trigger a "real" encoder initialization. 705 // Send a frame of 720p. This should trigger a "real" encoder initialization.
749 cricket::VideoFormat format( 706 cricket::VideoFormat format(
750 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); 707 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
751 cricket::FakeVideoCapturer capturer; 708 cricket::FakeVideoCapturer capturer;
752 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); 709 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
753 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); 710 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format));
754 EXPECT_TRUE(capturer.CaptureFrame()); 711 EXPECT_TRUE(capturer.CaptureFrame());
755 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); 712 ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode());
756 EXPECT_EQ(webrtc::kVideoCodecH264, 713 EXPECT_EQ(webrtc::kVideoCodecH264,
757 encoder_factory.encoders()[0]->GetCodecSettings().codecType); 714 encoder_factory_.encoders()[0]->GetCodecSettings().codecType);
758 715
759 channel.reset(); 716 channel.reset();
760 // Make sure DestroyVideoEncoder was called on the factory. 717 // Make sure DestroyVideoEncoder was called on the factory.
761 ASSERT_EQ(0u, encoder_factory.encoders().size()); 718 ASSERT_EQ(0u, encoder_factory_.encoders().size());
762 } 719 }
763 720
764 TEST_F(WebRtcVideoEngineTest, SimulcastDisabledForH264) { 721 TEST_F(WebRtcVideoEngineTest, SimulcastDisabledForH264) {
765 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 722 encoder_factory_.AddSupportedVideoCodecType("H264");
766 encoder_factory.AddSupportedVideoCodecType("H264");
767 723
768 std::unique_ptr<VideoMediaChannel> channel( 724 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
769 SetUpForExternalEncoderFactory(&encoder_factory));
770 725
771 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 726 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
772 EXPECT_TRUE( 727 EXPECT_TRUE(
773 channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs))); 728 channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs)));
774 729
775 // Send a frame of 720p. This should trigger a "real" encoder initialization. 730 // Send a frame of 720p. This should trigger a "real" encoder initialization.
776 cricket::VideoFormat format( 731 cricket::VideoFormat format(
777 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); 732 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
778 cricket::FakeVideoCapturer capturer; 733 cricket::FakeVideoCapturer capturer;
779 EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, &capturer)); 734 EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, &capturer));
780 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); 735 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format));
781 EXPECT_TRUE(capturer.CaptureFrame()); 736 EXPECT_TRUE(capturer.CaptureFrame());
782 737
783 ASSERT_EQ(1u, encoder_factory.encoders().size()); 738 ASSERT_EQ(1u, encoder_factory_.encoders().size());
784 FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0]; 739 FakeWebRtcVideoEncoder* encoder = encoder_factory_.encoders()[0];
785 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); 740 ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode());
786 EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType); 741 EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType);
787 EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); 742 EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams);
788 EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, nullptr)); 743 EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, nullptr));
789 } 744 }
790 745
791 // Test that the FlexFEC field trial properly alters the output of 746 // Test that the FlexFEC field trial properly alters the output of
792 // WebRtcVideoEngine::codecs(), for an existing |engine_| object. 747 // WebRtcVideoEngine::codecs(), for an existing |engine_| object.
793 // 748 //
794 // TODO(brandtr): Remove this test, when the FlexFEC field trial is gone. 749 // TODO(brandtr): Remove this test, when the FlexFEC field trial is gone.
795 TEST_F(WebRtcVideoEngineTest, 750 TEST_F(WebRtcVideoEngineTest,
796 Flexfec03SupportedAsInternalCodecBehindFieldTrial) { 751 Flexfec03SupportedAsInternalCodecBehindFieldTrial) {
797 auto is_flexfec = [](const VideoCodec& codec) { 752 auto is_flexfec = [](const VideoCodec& codec) {
798 if (codec.name == "flexfec-03") 753 if (codec.name == "flexfec-03")
799 return true; 754 return true;
800 return false; 755 return false;
801 }; 756 };
802 757
803 // FlexFEC is not active without field trial. 758 // FlexFEC is not active without field trial.
804 engine_.Init();
805 const std::vector<VideoCodec> codecs_before = engine_.codecs(); 759 const std::vector<VideoCodec> codecs_before = engine_.codecs();
806 EXPECT_EQ(codecs_before.end(), std::find_if(codecs_before.begin(), 760 EXPECT_EQ(codecs_before.end(), std::find_if(codecs_before.begin(),
807 codecs_before.end(), is_flexfec)); 761 codecs_before.end(), is_flexfec));
808 762
809 // FlexFEC is active with field trial. 763 // FlexFEC is active with field trial.
810 webrtc::test::ScopedFieldTrials override_field_trials_( 764 webrtc::test::ScopedFieldTrials override_field_trials_(
811 "WebRTC-FlexFEC-03-Advertised/Enabled/"); 765 "WebRTC-FlexFEC-03-Advertised/Enabled/");
812 const std::vector<VideoCodec> codecs_after = engine_.codecs(); 766 const std::vector<VideoCodec> codecs_after = engine_.codecs();
813 EXPECT_NE(codecs_after.end(), 767 EXPECT_NE(codecs_after.end(),
814 std::find_if(codecs_after.begin(), codecs_after.end(), is_flexfec)); 768 std::find_if(codecs_after.begin(), codecs_after.end(), is_flexfec));
815 } 769 }
816 770
817 // Test that external codecs are added to the end of the supported codec list. 771 // Test that external codecs are added to the end of the supported codec list.
818 TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecs) { 772 TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecs) {
819 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 773 encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec");
820 encoder_factory.AddSupportedVideoCodecType("FakeExternalCodec");
821 engine_.SetExternalEncoderFactory(&encoder_factory);
822 engine_.Init();
823 774
824 std::vector<cricket::VideoCodec> codecs(engine_.codecs()); 775 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
825 ASSERT_GE(codecs.size(), 2u); 776 ASSERT_GE(codecs.size(), 2u);
826 cricket::VideoCodec internal_codec = codecs.front(); 777 cricket::VideoCodec internal_codec = codecs.front();
827 cricket::VideoCodec external_codec = codecs.back(); 778 cricket::VideoCodec external_codec = codecs.back();
828 779
829 // The external codec will appear last in the vector. 780 // The external codec will appear last in the vector.
830 EXPECT_EQ("VP8", internal_codec.name); 781 EXPECT_EQ("VP8", internal_codec.name);
831 EXPECT_EQ("FakeExternalCodec", external_codec.name); 782 EXPECT_EQ("FakeExternalCodec", external_codec.name);
832 } 783 }
833 784
834 // Test that an external codec that was added after the engine was initialized 785 // Test that an external codec that was added after the engine was initialized
835 // does show up in the codec list after it was added. 786 // does show up in the codec list after it was added.
836 TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecsWithAddedCodec) { 787 TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecsWithAddedCodec) {
837 // Set up external encoder factory with first codec, and initialize engine. 788 // Set up external encoder factory with first codec, and initialize engine.
838 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 789 encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec1");
839 encoder_factory.AddSupportedVideoCodecType("FakeExternalCodec1");
840 engine_.SetExternalEncoderFactory(&encoder_factory);
841 engine_.Init();
842 790
843 // The first external codec will appear last in the vector. 791 // The first external codec will appear last in the vector.
844 std::vector<cricket::VideoCodec> codecs_before(engine_.codecs()); 792 std::vector<cricket::VideoCodec> codecs_before(engine_.codecs());
845 EXPECT_EQ("FakeExternalCodec1", codecs_before.back().name); 793 EXPECT_EQ("FakeExternalCodec1", codecs_before.back().name);
846 794
847 // Add second codec. 795 // Add second codec.
848 encoder_factory.AddSupportedVideoCodecType("FakeExternalCodec2"); 796 encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec2");
849 std::vector<cricket::VideoCodec> codecs_after(engine_.codecs()); 797 std::vector<cricket::VideoCodec> codecs_after(engine_.codecs());
850 EXPECT_EQ(codecs_before.size() + 1, codecs_after.size()); 798 EXPECT_EQ(codecs_before.size() + 1, codecs_after.size());
851 EXPECT_EQ("FakeExternalCodec2", codecs_after.back().name); 799 EXPECT_EQ("FakeExternalCodec2", codecs_after.back().name);
852 } 800 }
853 801
854 TEST_F(WebRtcVideoEngineTest, RegisterExternalDecodersIfSupported) { 802 TEST_F(WebRtcVideoEngineTest, RegisterExternalDecodersIfSupported) {
855 cricket::FakeWebRtcVideoDecoderFactory decoder_factory; 803 decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
856 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
857 cricket::VideoRecvParameters parameters; 804 cricket::VideoRecvParameters parameters;
858 parameters.codecs.push_back(GetEngineCodec("VP8")); 805 parameters.codecs.push_back(GetEngineCodec("VP8"));
859 806
860 std::unique_ptr<VideoMediaChannel> channel( 807 std::unique_ptr<VideoMediaChannel> channel(
861 SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs)); 808 SetUpForExternalDecoderFactory(parameters.codecs));
862 809
863 EXPECT_TRUE( 810 EXPECT_TRUE(
864 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc))); 811 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
865 ASSERT_EQ(1u, decoder_factory.decoders().size()); 812 ASSERT_EQ(1u, decoder_factory_.decoders().size());
866 813
867 // Setting codecs of the same type should not reallocate the decoder. 814 // Setting codecs of the same type should not reallocate the decoder.
868 EXPECT_TRUE(channel->SetRecvParameters(parameters)); 815 EXPECT_TRUE(channel->SetRecvParameters(parameters));
869 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders()); 816 EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders());
870 817
871 // Remove stream previously added to free the external decoder instance. 818 // Remove stream previously added to free the external decoder instance.
872 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc)); 819 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
873 EXPECT_EQ(0u, decoder_factory.decoders().size()); 820 EXPECT_EQ(0u, decoder_factory_.decoders().size());
874 } 821 }
875 822
876 // Verifies that we can set up decoders that are not internally supported. 823 // Verifies that we can set up decoders that are not internally supported.
877 TEST_F(WebRtcVideoEngineTest, RegisterExternalH264DecoderIfSupported) { 824 TEST_F(WebRtcVideoEngineTest, RegisterExternalH264DecoderIfSupported) {
878 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We 825 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
879 // can't even query the WebRtcVideoDecoderFactory for supported codecs. 826 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
880 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported 827 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
881 // codecs. 828 // codecs.
882 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 829 encoder_factory_.AddSupportedVideoCodecType("H264");
883 encoder_factory.AddSupportedVideoCodecType("H264"); 830 decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
884 engine_.SetExternalEncoderFactory(&encoder_factory);
885 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
886 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
887 std::vector<cricket::VideoCodec> codecs; 831 std::vector<cricket::VideoCodec> codecs;
888 codecs.push_back(GetEngineCodec("H264")); 832 codecs.push_back(GetEngineCodec("H264"));
889 833
890 std::unique_ptr<VideoMediaChannel> channel( 834 std::unique_ptr<VideoMediaChannel> channel(
891 SetUpForExternalDecoderFactory(&decoder_factory, codecs)); 835 SetUpForExternalDecoderFactory(codecs));
892 836
893 EXPECT_TRUE( 837 EXPECT_TRUE(
894 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc))); 838 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
895 ASSERT_EQ(1u, decoder_factory.decoders().size()); 839 ASSERT_EQ(1u, decoder_factory_.decoders().size());
896 } 840 }
897 841
898 class WebRtcVideoChannelBaseTest 842 class WebRtcVideoChannelBaseTest
899 : public VideoMediaChannelTest<WebRtcVideoEngine, WebRtcVideoChannel> { 843 : public VideoMediaChannelTest<WebRtcVideoEngine, WebRtcVideoChannel> {
900 protected: 844 protected:
901 typedef VideoMediaChannelTest<WebRtcVideoEngine, WebRtcVideoChannel> Base; 845 typedef VideoMediaChannelTest<WebRtcVideoEngine, WebRtcVideoChannel> Base;
902 846
903 cricket::VideoCodec GetEngineCodec(const std::string& name) { 847 cricket::VideoCodec GetEngineCodec(const std::string& name) {
904 for (const cricket::VideoCodec& engine_codec : engine_.codecs()) { 848 for (const cricket::VideoCodec& engine_codec : engine_.codecs()) {
905 if (CodecNamesEq(name, engine_codec.name)) 849 if (CodecNamesEq(name, engine_codec.name))
906 return engine_codec; 850 return engine_codec;
907 } 851 }
908 // This point should never be reached. 852 // This point should never be reached.
909 ADD_FAILURE() << "Unrecognized codec name: " << name; 853 ADD_FAILURE() << "Unrecognized codec name: " << name;
910 return cricket::VideoCodec(); 854 return cricket::VideoCodec();
911 } 855 }
912 856
913 cricket::VideoCodec DefaultCodec() override { return GetEngineCodec("VP8"); } 857 cricket::VideoCodec DefaultCodec() override { return GetEngineCodec("VP8"); }
914 }; 858 };
915 859
916 // Verifies that id given in stream params is passed to the decoder factory. 860 // Verifies that id given in stream params is passed to the decoder factory.
917 TEST_F(WebRtcVideoEngineTest, StreamParamsIdPassedToDecoderFactory) { 861 TEST_F(WebRtcVideoEngineTest, StreamParamsIdPassedToDecoderFactory) {
918 cricket::FakeWebRtcVideoDecoderFactory decoder_factory; 862 decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
919 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
920 cricket::VideoRecvParameters parameters; 863 cricket::VideoRecvParameters parameters;
921 parameters.codecs.push_back(GetEngineCodec("VP8")); 864 parameters.codecs.push_back(GetEngineCodec("VP8"));
922 865
923 std::unique_ptr<VideoMediaChannel> channel( 866 std::unique_ptr<VideoMediaChannel> channel(
924 SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs)); 867 SetUpForExternalDecoderFactory(parameters.codecs));
925 868
926 StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc); 869 StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc);
927 sp.id = "FakeStreamParamsId"; 870 sp.id = "FakeStreamParamsId";
928 EXPECT_TRUE(channel->AddRecvStream(sp)); 871 EXPECT_TRUE(channel->AddRecvStream(sp));
929 EXPECT_EQ(1u, decoder_factory.decoders().size()); 872 EXPECT_EQ(1u, decoder_factory_.decoders().size());
930 873
931 std::vector<cricket::VideoDecoderParams> params = decoder_factory.params(); 874 std::vector<cricket::VideoDecoderParams> params = decoder_factory_.params();
932 ASSERT_EQ(1u, params.size()); 875 ASSERT_EQ(1u, params.size());
933 EXPECT_EQ(sp.id, params[0].receive_stream_id); 876 EXPECT_EQ(sp.id, params[0].receive_stream_id);
934 } 877 }
935 878
936 TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) { 879 TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) {
937 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 880 encoder_factory_.AddSupportedVideoCodecType("VP8");
938 encoder_factory.AddSupportedVideoCodecType("VP8");
939 std::unique_ptr<FakeCall> fake_call( 881 std::unique_ptr<FakeCall> fake_call(
940 new FakeCall(webrtc::Call::Config(&event_log_))); 882 new FakeCall(webrtc::Call::Config(&event_log_)));
941 std::unique_ptr<VideoMediaChannel> channel( 883 std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
942 SetUpForExternalEncoderFactory(&encoder_factory));
943 ASSERT_TRUE( 884 ASSERT_TRUE(
944 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 885 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
945 cricket::VideoCodec codec = GetEngineCodec("VP8"); 886 cricket::VideoCodec codec = GetEngineCodec("VP8");
946 cricket::VideoSendParameters parameters; 887 cricket::VideoSendParameters parameters;
947 parameters.codecs.push_back(codec); 888 parameters.codecs.push_back(codec);
948 channel->OnReadyToSend(true); 889 channel->OnReadyToSend(true);
949 channel->SetSend(true); 890 channel->SetSend(true);
950 ASSERT_TRUE(channel->SetSendParameters(parameters)); 891 ASSERT_TRUE(channel->SetSendParameters(parameters));
951 892
952 cricket::FakeVideoCapturer capturer; 893 cricket::FakeVideoCapturer capturer;
953 VideoOptions options; 894 VideoOptions options;
954 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); 895 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
955 896
956 EXPECT_EQ(cricket::CS_RUNNING, 897 EXPECT_EQ(cricket::CS_RUNNING,
957 capturer.Start(capturer.GetSupportedFormats()->front())); 898 capturer.Start(capturer.GetSupportedFormats()->front()));
958 EXPECT_TRUE(capturer.CaptureFrame()); 899 EXPECT_TRUE(capturer.CaptureFrame());
959 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); 900 ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(1));
960 EXPECT_EQ(webrtc::kRealtimeVideo, 901 EXPECT_EQ(webrtc::kRealtimeVideo,
961 encoder_factory.encoders().back()->GetCodecSettings().mode); 902 encoder_factory_.encoders().back()->GetCodecSettings().mode);
962 903
963 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); 904 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
964 EXPECT_TRUE(capturer.CaptureFrame()); 905 EXPECT_TRUE(capturer.CaptureFrame());
965 // No change in content type, keep current encoder. 906 // No change in content type, keep current encoder.
966 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders()); 907 EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
967 908
968 options.is_screencast.emplace(true); 909 options.is_screencast.emplace(true);
969 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); 910 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
970 EXPECT_TRUE(capturer.CaptureFrame()); 911 EXPECT_TRUE(capturer.CaptureFrame());
971 // Change to screen content, recreate encoder. For the simulcast encoder 912 // Change to screen content, recreate encoder. For the simulcast encoder
972 // adapter case, this will result in two calls since InitEncode triggers a 913 // adapter case, this will result in two calls since InitEncode triggers a
973 // a new instance. 914 // a new instance.
974 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); 915 ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2));
975 EXPECT_EQ(webrtc::kScreensharing, 916 EXPECT_EQ(webrtc::kScreensharing,
976 encoder_factory.encoders().back()->GetCodecSettings().mode); 917 encoder_factory_.encoders().back()->GetCodecSettings().mode);
977 918
978 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); 919 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
979 EXPECT_TRUE(capturer.CaptureFrame()); 920 EXPECT_TRUE(capturer.CaptureFrame());
980 // Still screen content, no need to update encoder. 921 // Still screen content, no need to update encoder.
981 EXPECT_EQ(2, encoder_factory.GetNumCreatedEncoders()); 922 EXPECT_EQ(2, encoder_factory_.GetNumCreatedEncoders());
982 923
983 options.is_screencast.emplace(false); 924 options.is_screencast.emplace(false);
984 options.video_noise_reduction.emplace(false); 925 options.video_noise_reduction.emplace(false);
985 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); 926 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
986 // Change back to regular video content, update encoder. Also change 927 // Change back to regular video content, update encoder. Also change
987 // a non |is_screencast| option just to verify it doesn't affect recreation. 928 // a non |is_screencast| option just to verify it doesn't affect recreation.
988 EXPECT_TRUE(capturer.CaptureFrame()); 929 EXPECT_TRUE(capturer.CaptureFrame());
989 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); 930 ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(3));
990 EXPECT_EQ(webrtc::kRealtimeVideo, 931 EXPECT_EQ(webrtc::kRealtimeVideo,
991 encoder_factory.encoders().back()->GetCodecSettings().mode); 932 encoder_factory_.encoders().back()->GetCodecSettings().mode);
992 933
993 // Remove stream previously added to free the external encoder instance. 934 // Remove stream previously added to free the external encoder instance.
994 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); 935 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
995 EXPECT_EQ(0u, encoder_factory.encoders().size()); 936 EXPECT_EQ(0u, encoder_factory_.encoders().size());
996 } 937 }
997 938
998 #define WEBRTC_BASE_TEST(test) \ 939 #define WEBRTC_BASE_TEST(test) \
999 TEST_F(WebRtcVideoChannelBaseTest, test) { Base::test(); } 940 TEST_F(WebRtcVideoChannelBaseTest, test) { Base::test(); }
1000 941
1001 #define WEBRTC_DISABLED_BASE_TEST(test) \ 942 #define WEBRTC_DISABLED_BASE_TEST(test) \
1002 TEST_F(WebRtcVideoChannelBaseTest, DISABLED_##test) { Base::test(); } 943 TEST_F(WebRtcVideoChannelBaseTest, DISABLED_##test) { Base::test(); }
1003 944
1004 WEBRTC_BASE_TEST(SetSend); 945 WEBRTC_BASE_TEST(SetSend);
1005 WEBRTC_BASE_TEST(SetSendWithoutCodecs); 946 WEBRTC_BASE_TEST(SetSendWithoutCodecs);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 Base::TwoStreamsSendAndReceive(codec); 994 Base::TwoStreamsSendAndReceive(codec);
1054 } 995 }
1055 996
1056 class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { 997 class WebRtcVideoChannelTest : public WebRtcVideoEngineTest {
1057 public: 998 public:
1058 WebRtcVideoChannelTest() : WebRtcVideoChannelTest("") {} 999 WebRtcVideoChannelTest() : WebRtcVideoChannelTest("") {}
1059 explicit WebRtcVideoChannelTest(const char* field_trials) 1000 explicit WebRtcVideoChannelTest(const char* field_trials)
1060 : WebRtcVideoEngineTest(field_trials), last_ssrc_(0) {} 1001 : WebRtcVideoEngineTest(field_trials), last_ssrc_(0) {}
1061 void SetUp() override { 1002 void SetUp() override {
1062 fake_call_.reset(new FakeCall(webrtc::Call::Config(&event_log_))); 1003 fake_call_.reset(new FakeCall(webrtc::Call::Config(&event_log_)));
1063 engine_.Init();
1064 channel_.reset(engine_.CreateChannel(fake_call_.get(), GetMediaConfig(), 1004 channel_.reset(engine_.CreateChannel(fake_call_.get(), GetMediaConfig(),
1065 VideoOptions())); 1005 VideoOptions()));
1066 channel_->OnReadyToSend(true); 1006 channel_->OnReadyToSend(true);
1067 last_ssrc_ = 123; 1007 last_ssrc_ = 123;
1068 send_parameters_.codecs = engine_.codecs(); 1008 send_parameters_.codecs = engine_.codecs();
1069 recv_parameters_.codecs = engine_.codecs(); 1009 recv_parameters_.codecs = engine_.codecs();
1070 ASSERT_TRUE(channel_->SetSendParameters(send_parameters_)); 1010 ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
1071 } 1011 }
1072 1012
1073 protected: 1013 protected:
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after
1972 class Vp9SettingsTest : public WebRtcVideoChannelTest { 1912 class Vp9SettingsTest : public WebRtcVideoChannelTest {
1973 public: 1913 public:
1974 Vp9SettingsTest() : Vp9SettingsTest("") {} 1914 Vp9SettingsTest() : Vp9SettingsTest("") {}
1975 explicit Vp9SettingsTest(const char* field_trials) 1915 explicit Vp9SettingsTest(const char* field_trials)
1976 : WebRtcVideoChannelTest(field_trials) { 1916 : WebRtcVideoChannelTest(field_trials) {
1977 encoder_factory_.AddSupportedVideoCodecType("VP9"); 1917 encoder_factory_.AddSupportedVideoCodecType("VP9");
1978 } 1918 }
1979 virtual ~Vp9SettingsTest() {} 1919 virtual ~Vp9SettingsTest() {}
1980 1920
1981 protected: 1921 protected:
1982 void SetUp() override {
1983 engine_.SetExternalEncoderFactory(&encoder_factory_);
1984
1985 WebRtcVideoChannelTest::SetUp();
1986 }
1987
1988 void TearDown() override { 1922 void TearDown() override {
1989 // Remove references to encoder_factory_ since this will be destroyed 1923 // Remove references to encoder_factory_ since this will be destroyed
1990 // before channel_ and engine_. 1924 // before channel_ and engine_.
1991 ASSERT_TRUE(channel_->SetSendParameters(send_parameters_)); 1925 ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
1992 } 1926 }
1993
1994 cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
1995 }; 1927 };
1996 1928
1997 TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) { 1929 TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) {
1998 cricket::VideoSendParameters parameters; 1930 cricket::VideoSendParameters parameters;
1999 parameters.codecs.push_back(GetEngineCodec("VP9")); 1931 parameters.codecs.push_back(GetEngineCodec("VP9"));
2000 ASSERT_TRUE(channel_->SetSendParameters(parameters)); 1932 ASSERT_TRUE(channel_->SetSendParameters(parameters));
2001 1933
2002 FakeVideoSendStream* stream = SetUpSimulcast(false, false); 1934 FakeVideoSendStream* stream = SetUpSimulcast(false, false);
2003 1935
2004 cricket::FakeVideoCapturer capturer; 1936 cricket::FakeVideoCapturer capturer;
(...skipping 2486 matching lines...) Expand 10 before | Expand all | Expand 10 after
4491 TestReceiverLocalSsrcConfiguration(false); 4423 TestReceiverLocalSsrcConfiguration(false);
4492 } 4424 }
4493 4425
4494 TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrcOnExistingReceivers) { 4426 TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrcOnExistingReceivers) {
4495 TestReceiverLocalSsrcConfiguration(true); 4427 TestReceiverLocalSsrcConfiguration(true);
4496 } 4428 }
4497 4429
4498 class WebRtcVideoChannelSimulcastTest : public testing::Test { 4430 class WebRtcVideoChannelSimulcastTest : public testing::Test {
4499 public: 4431 public:
4500 WebRtcVideoChannelSimulcastTest() 4432 WebRtcVideoChannelSimulcastTest()
4501 : fake_call_(webrtc::Call::Config(&event_log_)), last_ssrc_(0) {} 4433 : fake_call_(webrtc::Call::Config(&event_log_)),
4434 engine_(&encoder_factory_, &decoder_factory_),
4435 last_ssrc_(0) {}
4502 4436
4503 void SetUp() override { 4437 void SetUp() override {
4504 engine_.Init();
4505 channel_.reset( 4438 channel_.reset(
4506 engine_.CreateChannel(&fake_call_, GetMediaConfig(), VideoOptions())); 4439 engine_.CreateChannel(&fake_call_, GetMediaConfig(), VideoOptions()));
4507 channel_->OnReadyToSend(true); 4440 channel_->OnReadyToSend(true);
4508 last_ssrc_ = 123; 4441 last_ssrc_ = 123;
4509 } 4442 }
4510 4443
4511 protected: 4444 protected:
4512 void VerifySimulcastSettings(const VideoCodec& codec, 4445 void VerifySimulcastSettings(const VideoCodec& codec,
4513 int capture_width, 4446 int capture_width,
4514 int capture_height, 4447 int capture_height,
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
4650 fake_call_.GetVideoReceiveStreams().size(); 4583 fake_call_.GetVideoReceiveStreams().size();
4651 EXPECT_TRUE(channel_->AddRecvStream(sp)); 4584 EXPECT_TRUE(channel_->AddRecvStream(sp));
4652 std::vector<FakeVideoReceiveStream*> streams = 4585 std::vector<FakeVideoReceiveStream*> streams =
4653 fake_call_.GetVideoReceiveStreams(); 4586 fake_call_.GetVideoReceiveStreams();
4654 EXPECT_EQ(num_streams + 1, streams.size()); 4587 EXPECT_EQ(num_streams + 1, streams.size());
4655 return streams[streams.size() - 1]; 4588 return streams[streams.size() - 1];
4656 } 4589 }
4657 4590
4658 webrtc::RtcEventLogNullImpl event_log_; 4591 webrtc::RtcEventLogNullImpl event_log_;
4659 FakeCall fake_call_; 4592 FakeCall fake_call_;
4593 cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
4594 cricket::FakeWebRtcVideoDecoderFactory decoder_factory_;
4660 WebRtcVideoEngine engine_; 4595 WebRtcVideoEngine engine_;
4661 std::unique_ptr<VideoMediaChannel> channel_; 4596 std::unique_ptr<VideoMediaChannel> channel_;
4662 uint32_t last_ssrc_; 4597 uint32_t last_ssrc_;
4663 }; 4598 };
4664 4599
4665 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWith2SimulcastStreams) { 4600 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWith2SimulcastStreams) {
4666 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 640, 360, 2, 2, false, 4601 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 640, 360, 2, 2, false,
4667 true); 4602 true);
4668 } 4603 }
4669 4604
(...skipping 28 matching lines...) Expand all
4698 4633
4699 TEST_F(WebRtcVideoChannelSimulcastTest, 4634 TEST_F(WebRtcVideoChannelSimulcastTest,
4700 NoSimulcastScreenshareWithoutConference) { 4635 NoSimulcastScreenshareWithoutConference) {
4701 webrtc::test::ScopedFieldTrials override_field_trials_( 4636 webrtc::test::ScopedFieldTrials override_field_trials_(
4702 "WebRTC-SimulcastScreenshare/Enabled/"); 4637 "WebRTC-SimulcastScreenshare/Enabled/");
4703 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true, 4638 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true,
4704 false); 4639 false);
4705 } 4640 }
4706 4641
4707 } // namespace cricket 4642 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698