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

Side by Side Diff: webrtc/audio/audio_send_stream_unittest.cc

Issue 2887733002: Store/restore RTP state for audio streams with same SSRC within a call (Closed)
Patch Set: Rebasement Jaxx Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/audio/audio_send_stream.cc ('k') | webrtc/call/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/audio/audio_send_stream.cc ('k') | webrtc/call/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698