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 |