| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 "format: {name: isac, clockrate_hz: 16000, num_channels: 1, " | 347 "format: {name: isac, clockrate_hz: 16000, num_channels: 1, " |
| 348 "parameters: {}}}}", | 348 "parameters: {}}}}", |
| 349 config.ToString()); | 349 config.ToString()); |
| 350 } | 350 } |
| 351 | 351 |
| 352 TEST(AudioSendStreamTest, ConstructDestruct) { | 352 TEST(AudioSendStreamTest, ConstructDestruct) { |
| 353 ConfigHelper helper(false, true); | 353 ConfigHelper helper(false, true); |
| 354 internal::AudioSendStream send_stream( | 354 internal::AudioSendStream send_stream( |
| 355 helper.config(), helper.audio_state(), helper.worker_queue(), | 355 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 356 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 356 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 357 helper.rtcp_rtt_stats()); | 357 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 358 } | 358 } |
| 359 | 359 |
| 360 TEST(AudioSendStreamTest, SendTelephoneEvent) { | 360 TEST(AudioSendStreamTest, SendTelephoneEvent) { |
| 361 ConfigHelper helper(false, true); | 361 ConfigHelper helper(false, true); |
| 362 internal::AudioSendStream send_stream( | 362 internal::AudioSendStream send_stream( |
| 363 helper.config(), helper.audio_state(), helper.worker_queue(), | 363 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 364 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 364 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 365 helper.rtcp_rtt_stats()); | 365 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 366 helper.SetupMockForSendTelephoneEvent(); | 366 helper.SetupMockForSendTelephoneEvent(); |
| 367 EXPECT_TRUE(send_stream.SendTelephoneEvent(kTelephoneEventPayloadType, | 367 EXPECT_TRUE(send_stream.SendTelephoneEvent(kTelephoneEventPayloadType, |
| 368 kTelephoneEventPayloadFrequency, kTelephoneEventCode, | 368 kTelephoneEventPayloadFrequency, kTelephoneEventCode, |
| 369 kTelephoneEventDuration)); | 369 kTelephoneEventDuration)); |
| 370 } | 370 } |
| 371 | 371 |
| 372 TEST(AudioSendStreamTest, SetMuted) { | 372 TEST(AudioSendStreamTest, SetMuted) { |
| 373 ConfigHelper helper(false, true); | 373 ConfigHelper helper(false, true); |
| 374 internal::AudioSendStream send_stream( | 374 internal::AudioSendStream send_stream( |
| 375 helper.config(), helper.audio_state(), helper.worker_queue(), | 375 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 376 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 376 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 377 helper.rtcp_rtt_stats()); | 377 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 378 EXPECT_CALL(*helper.channel_proxy(), SetInputMute(true)); | 378 EXPECT_CALL(*helper.channel_proxy(), SetInputMute(true)); |
| 379 send_stream.SetMuted(true); | 379 send_stream.SetMuted(true); |
| 380 } | 380 } |
| 381 | 381 |
| 382 TEST(AudioSendStreamTest, AudioBweCorrectObjectsOnChannelProxy) { | 382 TEST(AudioSendStreamTest, AudioBweCorrectObjectsOnChannelProxy) { |
| 383 ConfigHelper helper(true, true); | 383 ConfigHelper helper(true, true); |
| 384 internal::AudioSendStream send_stream( | 384 internal::AudioSendStream send_stream( |
| 385 helper.config(), helper.audio_state(), helper.worker_queue(), | 385 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 386 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 386 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 387 helper.rtcp_rtt_stats()); | 387 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 388 } | 388 } |
| 389 | 389 |
| 390 TEST(AudioSendStreamTest, NoAudioBweCorrectObjectsOnChannelProxy) { | 390 TEST(AudioSendStreamTest, NoAudioBweCorrectObjectsOnChannelProxy) { |
| 391 ConfigHelper helper(false, true); | 391 ConfigHelper helper(false, true); |
| 392 internal::AudioSendStream send_stream( | 392 internal::AudioSendStream send_stream( |
| 393 helper.config(), helper.audio_state(), helper.worker_queue(), | 393 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 394 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 394 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 395 helper.rtcp_rtt_stats()); | 395 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 396 } | 396 } |
| 397 | 397 |
| 398 TEST(AudioSendStreamTest, GetStats) { | 398 TEST(AudioSendStreamTest, GetStats) { |
| 399 ConfigHelper helper(false, true); | 399 ConfigHelper helper(false, true); |
| 400 internal::AudioSendStream send_stream( | 400 internal::AudioSendStream send_stream( |
| 401 helper.config(), helper.audio_state(), helper.worker_queue(), | 401 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 402 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 402 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 403 helper.rtcp_rtt_stats()); | 403 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 404 helper.SetupMockForGetStats(); | 404 helper.SetupMockForGetStats(); |
| 405 AudioSendStream::Stats stats = send_stream.GetStats(); | 405 AudioSendStream::Stats stats = send_stream.GetStats(); |
| 406 EXPECT_EQ(kSsrc, stats.local_ssrc); | 406 EXPECT_EQ(kSsrc, stats.local_ssrc); |
| 407 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); | 407 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); |
| 408 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); | 408 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); |
| 409 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), | 409 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), |
| 410 stats.packets_lost); | 410 stats.packets_lost); |
| 411 EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); | 411 EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); |
| 412 EXPECT_EQ(std::string(kIsacCodec.plname), stats.codec_name); | 412 EXPECT_EQ(std::string(kIsacCodec.plname), stats.codec_name); |
| 413 EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number), | 413 EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 424 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); | 424 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); |
| 425 EXPECT_EQ(kResidualEchoLikelihood, stats.residual_echo_likelihood); | 425 EXPECT_EQ(kResidualEchoLikelihood, stats.residual_echo_likelihood); |
| 426 EXPECT_FALSE(stats.typing_noise_detected); | 426 EXPECT_FALSE(stats.typing_noise_detected); |
| 427 } | 427 } |
| 428 | 428 |
| 429 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { | 429 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { |
| 430 ConfigHelper helper(false, true); | 430 ConfigHelper helper(false, true); |
| 431 internal::AudioSendStream send_stream( | 431 internal::AudioSendStream send_stream( |
| 432 helper.config(), helper.audio_state(), helper.worker_queue(), | 432 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 433 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 433 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 434 helper.rtcp_rtt_stats()); | 434 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 435 helper.SetupMockForGetStats(); | 435 helper.SetupMockForGetStats(); |
| 436 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); | 436 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); |
| 437 | 437 |
| 438 internal::AudioState* internal_audio_state = | 438 internal::AudioState* internal_audio_state = |
| 439 static_cast<internal::AudioState*>(helper.audio_state().get()); | 439 static_cast<internal::AudioState*>(helper.audio_state().get()); |
| 440 VoiceEngineObserver* voe_observer = | 440 VoiceEngineObserver* voe_observer = |
| 441 static_cast<VoiceEngineObserver*>(internal_audio_state); | 441 static_cast<VoiceEngineObserver*>(internal_audio_state); |
| 442 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); | 442 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); |
| 443 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); | 443 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); |
| 444 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); | 444 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 458 std::unique_ptr<AudioEncoder>* return_value) { | 458 std::unique_ptr<AudioEncoder>* return_value) { |
| 459 auto mock_encoder = SetupAudioEncoderMock(payload_type, format); | 459 auto mock_encoder = SetupAudioEncoderMock(payload_type, format); |
| 460 EXPECT_CALL(*mock_encoder.get(), EnableAudioNetworkAdaptor(_, _)) | 460 EXPECT_CALL(*mock_encoder.get(), EnableAudioNetworkAdaptor(_, _)) |
| 461 .WillOnce(Return(true)); | 461 .WillOnce(Return(true)); |
| 462 *return_value = std::move(mock_encoder); | 462 *return_value = std::move(mock_encoder); |
| 463 })); | 463 })); |
| 464 | 464 |
| 465 internal::AudioSendStream send_stream( | 465 internal::AudioSendStream send_stream( |
| 466 stream_config, helper.audio_state(), helper.worker_queue(), | 466 stream_config, helper.audio_state(), helper.worker_queue(), |
| 467 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 467 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 468 helper.rtcp_rtt_stats()); | 468 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 469 } | 469 } |
| 470 | 470 |
| 471 // VAD is applied when codec is mono and the CNG frequency matches the codec | 471 // VAD is applied when codec is mono and the CNG frequency matches the codec |
| 472 // clock rate. | 472 // clock rate. |
| 473 TEST(AudioSendStreamTest, SendCodecCanApplyVad) { | 473 TEST(AudioSendStreamTest, SendCodecCanApplyVad) { |
| 474 ConfigHelper helper(false, false); | 474 ConfigHelper helper(false, false); |
| 475 auto stream_config = helper.config(); | 475 auto stream_config = helper.config(); |
| 476 stream_config.send_codec_spec = | 476 stream_config.send_codec_spec = |
| 477 rtc::Optional<AudioSendStream::Config::SendCodecSpec>({9, kG722Format}); | 477 rtc::Optional<AudioSendStream::Config::SendCodecSpec>({9, kG722Format}); |
| 478 stream_config.send_codec_spec->cng_payload_type = rtc::Optional<int>(105); | 478 stream_config.send_codec_spec->cng_payload_type = rtc::Optional<int>(105); |
| 479 using ::testing::Invoke; | 479 using ::testing::Invoke; |
| 480 std::unique_ptr<AudioEncoder> stolen_encoder; | 480 std::unique_ptr<AudioEncoder> stolen_encoder; |
| 481 EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _)) | 481 EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _)) |
| 482 .WillOnce( | 482 .WillOnce( |
| 483 Invoke([&stolen_encoder](int payload_type, | 483 Invoke([&stolen_encoder](int payload_type, |
| 484 std::unique_ptr<AudioEncoder>* encoder) { | 484 std::unique_ptr<AudioEncoder>* encoder) { |
| 485 stolen_encoder = std::move(*encoder); | 485 stolen_encoder = std::move(*encoder); |
| 486 return true; | 486 return true; |
| 487 })); | 487 })); |
| 488 | 488 |
| 489 internal::AudioSendStream send_stream( | 489 internal::AudioSendStream send_stream( |
| 490 stream_config, helper.audio_state(), helper.worker_queue(), | 490 stream_config, helper.audio_state(), helper.worker_queue(), |
| 491 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 491 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 492 helper.rtcp_rtt_stats()); | 492 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 493 | 493 |
| 494 // We cannot truly determine if the encoder created is an AudioEncoderCng. It | 494 // We cannot truly determine if the encoder created is an AudioEncoderCng. It |
| 495 // is the only reasonable implementation that will return something from | 495 // is the only reasonable implementation that will return something from |
| 496 // ReclaimContainedEncoders, though. | 496 // ReclaimContainedEncoders, though. |
| 497 ASSERT_TRUE(stolen_encoder); | 497 ASSERT_TRUE(stolen_encoder); |
| 498 EXPECT_FALSE(stolen_encoder->ReclaimContainedEncoders().empty()); | 498 EXPECT_FALSE(stolen_encoder->ReclaimContainedEncoders().empty()); |
| 499 } | 499 } |
| 500 | 500 |
| 501 TEST(AudioSendStreamTest, DoesNotPassHigherBitrateThanMaxBitrate) { | 501 TEST(AudioSendStreamTest, DoesNotPassHigherBitrateThanMaxBitrate) { |
| 502 ConfigHelper helper(false, true); | 502 ConfigHelper helper(false, true); |
| 503 internal::AudioSendStream send_stream( | 503 internal::AudioSendStream send_stream( |
| 504 helper.config(), helper.audio_state(), helper.worker_queue(), | 504 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 505 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 505 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 506 helper.rtcp_rtt_stats()); | 506 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 507 EXPECT_CALL(*helper.channel_proxy(), | 507 EXPECT_CALL(*helper.channel_proxy(), |
| 508 SetBitrate(helper.config().max_bitrate_bps, _)); | 508 SetBitrate(helper.config().max_bitrate_bps, _)); |
| 509 send_stream.OnBitrateUpdated(helper.config().max_bitrate_bps + 5000, 0.0, 50, | 509 send_stream.OnBitrateUpdated(helper.config().max_bitrate_bps + 5000, 0.0, 50, |
| 510 6000); | 510 6000); |
| 511 } | 511 } |
| 512 | 512 |
| 513 TEST(AudioSendStreamTest, ProbingIntervalOnBitrateUpdated) { | 513 TEST(AudioSendStreamTest, ProbingIntervalOnBitrateUpdated) { |
| 514 ConfigHelper helper(false, true); | 514 ConfigHelper helper(false, true); |
| 515 internal::AudioSendStream send_stream( | 515 internal::AudioSendStream send_stream( |
| 516 helper.config(), helper.audio_state(), helper.worker_queue(), | 516 helper.config(), helper.audio_state(), helper.worker_queue(), |
| 517 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 517 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 518 helper.rtcp_rtt_stats()); | 518 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 519 EXPECT_CALL(*helper.channel_proxy(), SetBitrate(_, 5000)); | 519 EXPECT_CALL(*helper.channel_proxy(), SetBitrate(_, 5000)); |
| 520 send_stream.OnBitrateUpdated(50000, 0.0, 50, 5000); | 520 send_stream.OnBitrateUpdated(50000, 0.0, 50, 5000); |
| 521 } | 521 } |
| 522 | 522 |
| 523 // Test that AudioSendStream doesn't recreate the encoder unnecessarily. | 523 // Test that AudioSendStream doesn't recreate the encoder unnecessarily. |
| 524 TEST(AudioSendStreamTest, DontRecreateEncoder) { | 524 TEST(AudioSendStreamTest, DontRecreateEncoder) { |
| 525 ConfigHelper helper(false, false); | 525 ConfigHelper helper(false, false); |
| 526 // WillOnce is (currently) the default used by ConfigHelper if asked to set an | 526 // WillOnce is (currently) the default used by ConfigHelper if asked to set an |
| 527 // expectation for SetEncoder. Since this behavior is essential for this test | 527 // expectation for SetEncoder. Since this behavior is essential for this test |
| 528 // to be correct, it's instead set-up manually here. Otherwise a simple change | 528 // to be correct, it's instead set-up manually here. Otherwise a simple change |
| 529 // to ConfigHelper (say to WillRepeatedly) would silently make this test | 529 // to ConfigHelper (say to WillRepeatedly) would silently make this test |
| 530 // useless. | 530 // useless. |
| 531 EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _)) | 531 EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _)) |
| 532 .WillOnce(Return(true)); | 532 .WillOnce(Return(true)); |
| 533 | 533 |
| 534 auto stream_config = helper.config(); | 534 auto stream_config = helper.config(); |
| 535 stream_config.send_codec_spec = | 535 stream_config.send_codec_spec = |
| 536 rtc::Optional<AudioSendStream::Config::SendCodecSpec>({9, kG722Format}); | 536 rtc::Optional<AudioSendStream::Config::SendCodecSpec>({9, kG722Format}); |
| 537 stream_config.send_codec_spec->cng_payload_type = rtc::Optional<int>(105); | 537 stream_config.send_codec_spec->cng_payload_type = rtc::Optional<int>(105); |
| 538 internal::AudioSendStream send_stream( | 538 internal::AudioSendStream send_stream( |
| 539 stream_config, helper.audio_state(), helper.worker_queue(), | 539 stream_config, helper.audio_state(), helper.worker_queue(), |
| 540 helper.transport(), helper.bitrate_allocator(), helper.event_log(), | 540 helper.transport(), helper.bitrate_allocator(), helper.event_log(), |
| 541 helper.rtcp_rtt_stats()); | 541 helper.rtcp_rtt_stats(), rtc::Optional<RtpState>()); |
| 542 send_stream.Reconfigure(stream_config); | 542 send_stream.Reconfigure(stream_config); |
| 543 } | 543 } |
| 544 | 544 |
| 545 } // namespace test | 545 } // namespace test |
| 546 } // namespace webrtc | 546 } // namespace webrtc |
| OLD | NEW |