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 27 matching lines...) Expand all Loading... |
38 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48); | 38 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48); |
39 config.num_channels = codec_inst.channels; | 39 config.num_channels = codec_inst.channels; |
40 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); | 40 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); |
41 config.payload_type = codec_inst.pltype; | 41 config.payload_type = codec_inst.pltype; |
42 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip | 42 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip |
43 : AudioEncoderOpus::kAudio; | 43 : AudioEncoderOpus::kAudio; |
44 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); | 44 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); |
45 return config; | 45 return config; |
46 } | 46 } |
47 | 47 |
| 48 AudioEncoderOpus::Config CreateConfigWithParameters( |
| 49 const SdpAudioFormat::Parameters& params) { |
| 50 webrtc::SdpAudioFormat format("opus", 48000, 2, params); |
| 51 return AudioEncoderOpus::CreateConfig(0, format); |
| 52 } |
| 53 |
48 struct AudioEncoderOpusStates { | 54 struct AudioEncoderOpusStates { |
49 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; | 55 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; |
50 MockSmoothingFilter* mock_bitrate_smoother; | 56 MockSmoothingFilter* mock_bitrate_smoother; |
51 std::unique_ptr<AudioEncoderOpus> encoder; | 57 std::unique_ptr<AudioEncoderOpus> encoder; |
52 std::unique_ptr<SimulatedClock> simulated_clock; | 58 std::unique_ptr<SimulatedClock> simulated_clock; |
53 AudioEncoderOpus::Config config; | 59 AudioEncoderOpus::Config config; |
54 }; | 60 }; |
55 | 61 |
56 AudioEncoderOpusStates CreateCodec(size_t num_channels) { | 62 AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
57 AudioEncoderOpusStates states; | 63 AudioEncoderOpusStates states; |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 } | 544 } |
539 | 545 |
540 // Should encode now. | 546 // Should encode now. |
541 states.encoder->Encode(rtp_timestamp, audio_frames->GetNextBlock(), | 547 states.encoder->Encode(rtp_timestamp, audio_frames->GetNextBlock(), |
542 &encoded); | 548 &encoded); |
543 EXPECT_GT(encoded.size(), 0u); | 549 EXPECT_GT(encoded.size(), 0u); |
544 encoded.Clear(); | 550 encoded.Clear(); |
545 } | 551 } |
546 } | 552 } |
547 | 553 |
| 554 TEST(AudioEncoderOpusTest, TestConfigDefaults) { |
| 555 const AudioEncoderOpus::Config config = |
| 556 AudioEncoderOpus::CreateConfig(0, {"opus", 48000, 2}); |
| 557 |
| 558 EXPECT_EQ(48000, config.max_playback_rate_hz); |
| 559 EXPECT_EQ(1U, config.num_channels); |
| 560 EXPECT_FALSE(config.fec_enabled); |
| 561 EXPECT_FALSE(config.dtx_enabled); |
| 562 EXPECT_EQ(20, config.frame_size_ms); |
| 563 } |
| 564 |
| 565 TEST(AudioEncoderOpusTest, TestConfigFromParams) { |
| 566 AudioEncoderOpus::Config config; |
| 567 |
| 568 config = CreateConfigWithParameters({{"stereo", "0"}}); |
| 569 EXPECT_EQ(1U, config.num_channels); |
| 570 |
| 571 config = CreateConfigWithParameters({{"stereo", "1"}}); |
| 572 EXPECT_EQ(2U, config.num_channels); |
| 573 |
| 574 config = CreateConfigWithParameters({{"useinbandfec", "0"}}); |
| 575 EXPECT_EQ(false, config.fec_enabled); |
| 576 |
| 577 config = CreateConfigWithParameters({{"useinbandfec", "1"}}); |
| 578 EXPECT_EQ(true, config.fec_enabled); |
| 579 |
| 580 config = CreateConfigWithParameters({{"usedtx", "0"}}); |
| 581 EXPECT_EQ(false, config.dtx_enabled); |
| 582 |
| 583 config = CreateConfigWithParameters({{"usedtx", "1"}}); |
| 584 EXPECT_EQ(true, config.dtx_enabled); |
| 585 |
| 586 config = CreateConfigWithParameters({{"maxplaybackrate", "12345"}}); |
| 587 EXPECT_EQ(12345, config.max_playback_rate_hz); |
| 588 |
| 589 config = CreateConfigWithParameters({{"maxaveragebitrate", "96000"}}); |
| 590 EXPECT_EQ(96000, config.bitrate_bps); |
| 591 |
| 592 config = CreateConfigWithParameters({{"maxptime", "40"}}); |
| 593 for (int frame_length : config.supported_frame_lengths_ms) { |
| 594 EXPECT_LE(frame_length, 40); |
| 595 } |
| 596 |
| 597 config = CreateConfigWithParameters({{"minptime", "40"}}); |
| 598 for (int frame_length : config.supported_frame_lengths_ms) { |
| 599 EXPECT_GE(frame_length, 40); |
| 600 } |
| 601 |
| 602 config = CreateConfigWithParameters({{"ptime", "40"}}); |
| 603 EXPECT_EQ(40, config.frame_size_ms); |
| 604 } |
| 605 |
| 606 TEST(AudioEncoderOpusTest, TestConfigFromInvalidParams) { |
| 607 const webrtc::SdpAudioFormat format("opus", 48000, 2); |
| 608 const AudioEncoderOpus::Config default_config = |
| 609 AudioEncoderOpus::CreateConfig(0, format); |
| 610 const std::vector<int> default_supported_frame_lengths_ms({20, 60}); |
| 611 |
| 612 AudioEncoderOpus::Config config; |
| 613 config = CreateConfigWithParameters({{"stereo", "invalid"}}); |
| 614 EXPECT_EQ(default_config.num_channels, config.num_channels); |
| 615 |
| 616 config = CreateConfigWithParameters({{"useinbandfec", "invalid"}}); |
| 617 EXPECT_EQ(default_config.fec_enabled, config.fec_enabled); |
| 618 |
| 619 config = CreateConfigWithParameters({{"usedtx", "invalid"}}); |
| 620 EXPECT_EQ(default_config.dtx_enabled, config.dtx_enabled); |
| 621 |
| 622 config = CreateConfigWithParameters({{"maxplaybackrate", "0"}}); |
| 623 EXPECT_EQ(default_config.max_playback_rate_hz, config.max_playback_rate_hz); |
| 624 |
| 625 config = CreateConfigWithParameters({{"maxplaybackrate", "-23"}}); |
| 626 EXPECT_EQ(default_config.max_playback_rate_hz, config.max_playback_rate_hz); |
| 627 |
| 628 config = CreateConfigWithParameters({{"maxplaybackrate", "not a number!"}}); |
| 629 EXPECT_EQ(default_config.max_playback_rate_hz, config.max_playback_rate_hz); |
| 630 |
| 631 config = CreateConfigWithParameters({{"maxaveragebitrate", "0"}}); |
| 632 EXPECT_EQ(default_config.bitrate_bps, config.bitrate_bps); |
| 633 |
| 634 config = CreateConfigWithParameters({{"maxaveragebitrate", "-1000"}}); |
| 635 EXPECT_EQ(default_config.bitrate_bps, config.bitrate_bps); |
| 636 |
| 637 config = CreateConfigWithParameters({{"maxaveragebitrate", "not a number!"}}); |
| 638 EXPECT_EQ(default_config.bitrate_bps, config.bitrate_bps); |
| 639 |
| 640 config = CreateConfigWithParameters({{"maxptime", "invalid"}}); |
| 641 EXPECT_EQ(default_supported_frame_lengths_ms, |
| 642 config.supported_frame_lengths_ms); |
| 643 |
| 644 config = CreateConfigWithParameters({{"minptime", "invalid"}}); |
| 645 EXPECT_EQ(default_supported_frame_lengths_ms, |
| 646 config.supported_frame_lengths_ms); |
| 647 |
| 648 config = CreateConfigWithParameters({{"ptime", "invalid"}}); |
| 649 EXPECT_EQ(default_supported_frame_lengths_ms, |
| 650 config.supported_frame_lengths_ms); |
| 651 } |
| 652 |
| 653 // Test that bitrate will be overridden by the "maxaveragebitrate" parameter. |
| 654 // Also test that the "maxaveragebitrate" can't be set to values outside the |
| 655 // range of 6000 and 510000 |
| 656 TEST(AudioEncoderOpusTest, SetSendCodecOpusMaxAverageBitrate) { |
| 657 // Ignore if less than 6000. |
| 658 const AudioEncoderOpus::Config config1 = AudioEncoderOpus::CreateConfig( |
| 659 0, {"opus", 48000, 2, {{"maxaveragebitrate", "5999"}}}); |
| 660 EXPECT_EQ(6000, *config1.bitrate_bps); |
| 661 |
| 662 // Ignore if larger than 510000. |
| 663 const AudioEncoderOpus::Config config2 = AudioEncoderOpus::CreateConfig( |
| 664 0, {"opus", 48000, 2, {{"maxaveragebitrate", "510001"}}}); |
| 665 EXPECT_EQ(510000, *config2.bitrate_bps); |
| 666 |
| 667 const AudioEncoderOpus::Config config3 = AudioEncoderOpus::CreateConfig( |
| 668 0, {"opus", 48000, 2, {{"maxaveragebitrate", "200000"}}}); |
| 669 EXPECT_EQ(200000, *config3.bitrate_bps); |
| 670 } |
| 671 |
| 672 // Test maxplaybackrate <= 8000 triggers Opus narrow band mode. |
| 673 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateNb) { |
| 674 auto config = CreateConfigWithParameters({{"maxplaybackrate", "8000"}}); |
| 675 EXPECT_EQ(8000, config.max_playback_rate_hz); |
| 676 EXPECT_EQ(12000, *config.bitrate_bps); |
| 677 |
| 678 config = CreateConfigWithParameters({{"maxplaybackrate", "8000"}, |
| 679 {"stereo", "1"}}); |
| 680 EXPECT_EQ(8000, config.max_playback_rate_hz); |
| 681 EXPECT_EQ(24000, *config.bitrate_bps); |
| 682 } |
| 683 |
| 684 // Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode. |
| 685 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateMb) { |
| 686 auto config = CreateConfigWithParameters({{"maxplaybackrate", "8001"}}); |
| 687 EXPECT_EQ(8001, config.max_playback_rate_hz); |
| 688 EXPECT_EQ(20000, *config.bitrate_bps); |
| 689 |
| 690 config = CreateConfigWithParameters({{"maxplaybackrate", "8001"}, |
| 691 {"stereo", "1"}}); |
| 692 EXPECT_EQ(8001, config.max_playback_rate_hz); |
| 693 EXPECT_EQ(40000, *config.bitrate_bps); |
| 694 } |
| 695 |
| 696 // Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode. |
| 697 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateWb) { |
| 698 auto config = CreateConfigWithParameters({{"maxplaybackrate", "12001"}}); |
| 699 EXPECT_EQ(12001, config.max_playback_rate_hz); |
| 700 EXPECT_EQ(20000, *config.bitrate_bps); |
| 701 |
| 702 config = CreateConfigWithParameters({{"maxplaybackrate", "12001"}, |
| 703 {"stereo", "1"}}); |
| 704 EXPECT_EQ(12001, config.max_playback_rate_hz); |
| 705 EXPECT_EQ(40000, *config.bitrate_bps); |
| 706 } |
| 707 |
| 708 // Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode. |
| 709 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateSwb) { |
| 710 auto config = CreateConfigWithParameters({{"maxplaybackrate", "16001"}}); |
| 711 EXPECT_EQ(16001, config.max_playback_rate_hz); |
| 712 EXPECT_EQ(32000, *config.bitrate_bps); |
| 713 |
| 714 config = CreateConfigWithParameters({{"maxplaybackrate", "16001"}, |
| 715 {"stereo", "1"}}); |
| 716 EXPECT_EQ(16001, config.max_playback_rate_hz); |
| 717 EXPECT_EQ(64000, *config.bitrate_bps); |
| 718 } |
| 719 |
| 720 // Test 24000 < maxplaybackrate triggers Opus full band mode. |
| 721 TEST(AudioEncoderOpusTest, SetMaxPlaybackRateFb) { |
| 722 auto config = CreateConfigWithParameters({{"maxplaybackrate", "24001"}}); |
| 723 EXPECT_EQ(24001, config.max_playback_rate_hz); |
| 724 EXPECT_EQ(32000, *config.bitrate_bps); |
| 725 |
| 726 config = CreateConfigWithParameters({{"maxplaybackrate", "24001"}, |
| 727 {"stereo", "1"}}); |
| 728 EXPECT_EQ(24001, config.max_playback_rate_hz); |
| 729 EXPECT_EQ(64000, *config.bitrate_bps); |
| 730 } |
| 731 |
548 } // namespace webrtc | 732 } // namespace webrtc |
OLD | NEW |