| 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 |