OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |