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

Side by Side Diff: webrtc/media/engine/webrtcvoiceengine_unittest.cc

Issue 2705093002: Injectable audio encoders: WebRtcVoiceEngine and company (Closed)
Patch Set: Channel::GetSendCodec asks both its acm and its codec manager. 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2008 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 23 matching lines...) Expand all
34 using testing::ContainerEq; 34 using testing::ContainerEq;
35 using testing::Return; 35 using testing::Return;
36 using testing::StrictMock; 36 using testing::StrictMock;
37 37
38 namespace { 38 namespace {
39 39
40 constexpr uint32_t kMaxUnsignaledRecvStreams = 1; 40 constexpr uint32_t kMaxUnsignaledRecvStreams = 1;
41 41
42 const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1); 42 const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
43 const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1); 43 const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
44 const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2); 44 const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 32000, 2);
45 const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1); 45 const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
46 const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1); 46 const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
47 const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1); 47 const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
48 const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1); 48 const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
49 const cricket::AudioCodec 49 const cricket::AudioCodec
50 kTelephoneEventCodec1(106, "telephone-event", 8000, 0, 1); 50 kTelephoneEventCodec1(106, "telephone-event", 8000, 0, 1);
51 const cricket::AudioCodec 51 const cricket::AudioCodec
52 kTelephoneEventCodec2(107, "telephone-event", 32000, 0, 1); 52 kTelephoneEventCodec2(107, "telephone-event", 32000, 0, 1);
53 53
54 const uint32_t kSsrc0 = 0; 54 const uint32_t kSsrc0 = 0;
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 return channel_->SetRtpSendParameters(ssrc, parameters); 355 return channel_->SetRtpSendParameters(ssrc, parameters);
356 } 356 }
357 357
358 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) { 358 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
359 cricket::AudioSendParameters send_parameters; 359 cricket::AudioSendParameters send_parameters;
360 send_parameters.codecs.push_back(codec); 360 send_parameters.codecs.push_back(codec);
361 send_parameters.max_bandwidth_bps = bitrate; 361 send_parameters.max_bandwidth_bps = bitrate;
362 SetSendParameters(send_parameters); 362 SetSendParameters(send_parameters);
363 } 363 }
364 364
365 void CheckSendCodec(int32_t ssrc, 365 void CheckSendCodecBitrate(int32_t ssrc,
366 const char expected_name[], 366 const char expected_name[],
367 int expected_channels, 367 int expected_bitrate) {
368 int expected_bitrate) { 368 const auto& spec = GetSendStreamConfig(ssrc).send_codec_spec;
369 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst; 369 EXPECT_EQ(expected_name, spec->format.name);
370 EXPECT_STREQ(expected_name, codec.plname); 370 EXPECT_EQ(expected_bitrate, spec->target_bitrate_bps);
371 EXPECT_EQ(expected_channels, codec.channels);
372 EXPECT_EQ(expected_bitrate, codec.rate);
373 } 371 }
374 372
375 int GetOpusMaxPlaybackRate(int32_t ssrc) { 373 rtc::Optional<int> GetCodecBitrate(int32_t ssrc) {
376 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate; 374 return GetSendStreamConfig(ssrc).send_codec_spec->target_bitrate_bps;
377 }
378
379 bool GetOpusDtx(int32_t ssrc) {
380 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
381 }
382
383 bool GetCodecFec(int32_t ssrc) {
384 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
385 }
386
387 int GetCodecBitrate(int32_t ssrc) {
388 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
389 }
390
391 int GetCodecPacSize(int32_t ssrc) {
392 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
393 } 375 }
394 376
395 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) { 377 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
396 return GetSendStreamConfig(ssrc).audio_network_adaptor_config; 378 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
397 } 379 }
398 380
399 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec, 381 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
400 int global_max, 382 int global_max,
401 int stream_max, 383 int stream_max,
402 bool expected_result, 384 bool expected_result,
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 GetRecvStreamConfig(kSsrcX); 693 GetRecvStreamConfig(kSsrcX);
712 EXPECT_EQ(kSsrcX, config.rtp.remote_ssrc); 694 EXPECT_EQ(kSsrcX, config.rtp.remote_ssrc);
713 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc); 695 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
714 EXPECT_FALSE(config.rtp.transport_cc); 696 EXPECT_FALSE(config.rtp.transport_cc);
715 EXPECT_EQ(0u, config.rtp.extensions.size()); 697 EXPECT_EQ(0u, config.rtp.extensions.size());
716 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_), 698 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
717 config.rtcp_send_transport); 699 config.rtcp_send_transport);
718 EXPECT_EQ("", config.sync_group); 700 EXPECT_EQ("", config.sync_group);
719 } 701 }
720 702
721 // Tests that the list of supported codecs is created properly and ordered
722 // correctly (such that opus appears first).
723 // TODO(ossu): This test should move into a separate builtin audio codecs
724 // module.
725 TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
726 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
727 ASSERT_FALSE(codecs.empty());
728 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
729 EXPECT_EQ(48000, codecs[0].clockrate);
730 EXPECT_EQ(2, codecs[0].channels);
731 EXPECT_EQ(64000, codecs[0].bitrate);
732 }
733
734 TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) { 703 TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
735 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs(); 704 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
736 bool opus_found = false; 705 bool opus_found = false;
737 for (cricket::AudioCodec codec : codecs) { 706 for (cricket::AudioCodec codec : codecs) {
738 if (codec.name == "opus") { 707 if (codec.name == "opus") {
739 EXPECT_TRUE(HasTransportCc(codec)); 708 EXPECT_TRUE(HasTransportCc(codec));
740 opus_found = true; 709 opus_found = true;
741 } 710 }
742 } 711 }
743 EXPECT_TRUE(opus_found); 712 EXPECT_TRUE(opus_found);
744 } 713 }
745 714
746 // Tests that we can find codecs by name or id, and that we interpret the
747 // clockrate and bitrate fields properly.
748 TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
749 cricket::AudioCodec codec;
750 webrtc::CodecInst codec_inst;
751 // Find PCMU with explicit clockrate and bitrate.
752 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
753 // Find ISAC with explicit clockrate and 0 bitrate.
754 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
755 // Find telephone-event with explicit clockrate and 0 bitrate.
756 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
757 &codec_inst));
758 // Find telephone-event with explicit clockrate and 0 bitrate.
759 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
760 &codec_inst));
761 // Find ISAC with a different payload id.
762 codec = kIsacCodec;
763 codec.id = 127;
764 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
765 EXPECT_EQ(codec.id, codec_inst.pltype);
766 // Find PCMU with a 0 clockrate.
767 codec = kPcmuCodec;
768 codec.clockrate = 0;
769 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
770 EXPECT_EQ(codec.id, codec_inst.pltype);
771 EXPECT_EQ(8000, codec_inst.plfreq);
772 // Find PCMU with a 0 bitrate.
773 codec = kPcmuCodec;
774 codec.bitrate = 0;
775 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
776 EXPECT_EQ(codec.id, codec_inst.pltype);
777 EXPECT_EQ(64000, codec_inst.rate);
778 // Find ISAC with an explicit bitrate.
779 codec = kIsacCodec;
780 codec.bitrate = 32000;
781 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
782 EXPECT_EQ(codec.id, codec_inst.pltype);
783 EXPECT_EQ(32000, codec_inst.rate);
784 }
785
786 // Test that we set our inbound codecs properly, including changing PT. 715 // Test that we set our inbound codecs properly, including changing PT.
787 TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) { 716 TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
788 EXPECT_TRUE(SetupChannel()); 717 EXPECT_TRUE(SetupChannel());
789 cricket::AudioRecvParameters parameters; 718 cricket::AudioRecvParameters parameters;
790 parameters.codecs.push_back(kIsacCodec); 719 parameters.codecs.push_back(kIsacCodec);
791 parameters.codecs.push_back(kPcmuCodec); 720 parameters.codecs.push_back(kPcmuCodec);
792 parameters.codecs.push_back(kTelephoneEventCodec1); 721 parameters.codecs.push_back(kTelephoneEventCodec1);
793 parameters.codecs.push_back(kTelephoneEventCodec2); 722 parameters.codecs.push_back(kTelephoneEventCodec2);
794 parameters.codecs[0].id = 106; // collide with existing CN 32k 723 parameters.codecs[0].id = 106; // collide with existing CN 32k
795 parameters.codecs[2].id = 126; 724 parameters.codecs[2].id = 126;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 EXPECT_TRUE(SetupRecvStream()); 856 EXPECT_TRUE(SetupRecvStream());
928 cricket::AudioRecvParameters parameters; 857 cricket::AudioRecvParameters parameters;
929 parameters.codecs.push_back(kIsacCodec); 858 parameters.codecs.push_back(kIsacCodec);
930 parameters.codecs.push_back(kCn16000Codec); 859 parameters.codecs.push_back(kCn16000Codec);
931 EXPECT_TRUE(channel_->SetRecvParameters(parameters)); 860 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
932 channel_->SetPlayout(true); 861 channel_->SetPlayout(true);
933 862
934 parameters.codecs.push_back(kOpusCodec); 863 parameters.codecs.push_back(kOpusCodec);
935 EXPECT_TRUE(channel_->SetRecvParameters(parameters)); 864 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
936 EXPECT_TRUE(GetRecvStream(kSsrcX).started()); 865 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
937 webrtc::CodecInst gcodec;
938 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
939 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
940 } 866 }
941 867
942 TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) { 868 TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
943 EXPECT_TRUE(SetupSendStream()); 869 EXPECT_TRUE(SetupSendStream());
944 870
945 // Test that when autobw is enabled, bitrate is kept as the default 871 // Test that when autobw is enabled, bitrate is kept as the default
946 // value. autobw is enabled for the following tests because the target 872 // value. autobw is enabled for the following tests because the target
947 // bitrate is <= 0. 873 // bitrate is <= 0.
948 874
949 // ISAC, default bitrate == 32000. 875 // ISAC, default bitrate == 32000.
950 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000); 876 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
951 877
952 // PCMU, default bitrate == 64000. 878 // PCMU, default bitrate == 64000.
953 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000); 879 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
954 880
955 // opus, default bitrate == 64000. 881 // opus, default bitrate == 32000 in mono.
956 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000); 882 TestMaxSendBandwidth(kOpusCodec, -1, true, 32000);
957 } 883 }
958 884
959 TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) { 885 TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
960 EXPECT_TRUE(SetupSendStream()); 886 EXPECT_TRUE(SetupSendStream());
961 887
962 // Test that the bitrate of a multi-rate codec is always the maximum.
963
964 // ISAC, default bitrate == 32000. 888 // ISAC, default bitrate == 32000.
965 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
966 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000); 889 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
967 // Rates above the max (56000) should be capped. 890 // Rates above the max (56000) should be capped.
968 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000); 891 TestMaxSendBandwidth(kIsacCodec, 100000, true, 32000);
969 892
970 // opus, default bitrate == 64000. 893 // opus, default bitrate == 64000.
971 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000); 894 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
972 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000); 895 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
973 // Rates above the max (510000) should be capped. 896 // Rates above the max (510000) should be capped.
974 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000); 897 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
975 } 898 }
976 899
977 TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) { 900 TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
978 EXPECT_TRUE(SetupSendStream()); 901 EXPECT_TRUE(SetupSendStream());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 send_parameters_.max_bandwidth_bps = 128; 944 send_parameters_.max_bandwidth_bps = 128;
1022 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_)); 945 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
1023 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX)); 946 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1024 } 947 }
1025 948
1026 // Test that the per-stream bitrate limit and the global 949 // Test that the per-stream bitrate limit and the global
1027 // bitrate limit both apply. 950 // bitrate limit both apply.
1028 TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) { 951 TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1029 EXPECT_TRUE(SetupSendStream()); 952 EXPECT_TRUE(SetupSendStream());
1030 953
1031 // opus, default bitrate == 64000. 954 // opus, default bitrate == 32000.
1032 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000); 955 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 32000);
1033 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000); 956 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1034 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000); 957 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1035 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000); 958 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1036 959
1037 // CBR codecs allow both maximums to exceed the bitrate. 960 // CBR codecs allow both maximums to exceed the bitrate.
1038 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000); 961 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1039 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000); 962 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1040 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000); 963 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1041 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000); 964 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1042 965
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) { 1030 TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1108 SetupForMultiSendStream(); 1031 SetupForMultiSendStream();
1109 // Create send streams. 1032 // Create send streams.
1110 for (uint32_t ssrc : kSsrcs4) { 1033 for (uint32_t ssrc : kSsrcs4) {
1111 EXPECT_TRUE( 1034 EXPECT_TRUE(
1112 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc))); 1035 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1113 } 1036 }
1114 // Configure one stream to be limited by the stream config, another to be 1037 // Configure one stream to be limited by the stream config, another to be
1115 // limited by the global max, and the third one with no per-stream limit 1038 // limited by the global max, and the third one with no per-stream limit
1116 // (still subject to the global limit). 1039 // (still subject to the global limit).
1117 SetGlobalMaxBitrate(kOpusCodec, 64000); 1040 SetGlobalMaxBitrate(kOpusCodec, 32000);
1118 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000)); 1041 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 24000));
1119 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000)); 1042 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 48000));
1120 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1)); 1043 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1121 1044
1122 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0])); 1045 EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
1123 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1])); 1046 EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[1]));
1124 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2])); 1047 EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
1125 1048
1126 // Remove the global cap; the streams should switch to their respective 1049 // Remove the global cap; the streams should switch to their respective
1127 // maximums (or remain unchanged if there was no other limit on them.) 1050 // maximums (or remain unchanged if there was no other limit on them.)
1128 SetGlobalMaxBitrate(kOpusCodec, -1); 1051 SetGlobalMaxBitrate(kOpusCodec, -1);
1129 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0])); 1052 EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
1130 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1])); 1053 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[1]));
1131 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2])); 1054 EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
1132 } 1055 }
1133 1056
1134 // Test that GetRtpSendParameters returns the currently configured codecs. 1057 // Test that GetRtpSendParameters returns the currently configured codecs.
1135 TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) { 1058 TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
1136 EXPECT_TRUE(SetupSendStream()); 1059 EXPECT_TRUE(SetupSendStream());
1137 cricket::AudioSendParameters parameters; 1060 cricket::AudioSendParameters parameters;
1138 parameters.codecs.push_back(kIsacCodec); 1061 parameters.codecs.push_back(kIsacCodec);
1139 parameters.codecs.push_back(kPcmuCodec); 1062 parameters.codecs.push_back(kPcmuCodec);
1140 SetSendParameters(parameters); 1063 SetSendParameters(parameters);
1141 1064
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 } 1199 }
1277 1200
1278 // Test that we apply codecs properly. 1201 // Test that we apply codecs properly.
1279 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) { 1202 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
1280 EXPECT_TRUE(SetupSendStream()); 1203 EXPECT_TRUE(SetupSendStream());
1281 cricket::AudioSendParameters parameters; 1204 cricket::AudioSendParameters parameters;
1282 parameters.codecs.push_back(kIsacCodec); 1205 parameters.codecs.push_back(kIsacCodec);
1283 parameters.codecs.push_back(kPcmuCodec); 1206 parameters.codecs.push_back(kPcmuCodec);
1284 parameters.codecs.push_back(kCn8000Codec); 1207 parameters.codecs.push_back(kCn8000Codec);
1285 parameters.codecs[0].id = 96; 1208 parameters.codecs[0].id = 96;
1286 parameters.codecs[0].bitrate = 48000; 1209 parameters.codecs[0].bitrate = 22000;
1287 const int initial_num = call_.GetNumCreatedSendStreams();
1288 SetSendParameters(parameters); 1210 SetSendParameters(parameters);
1289 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams()); 1211 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1290 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1212 EXPECT_EQ(96, send_codec_spec.payload_type);
1291 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1213 EXPECT_EQ(22000, send_codec_spec.target_bitrate_bps);
1292 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate); 1214 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
1293 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1215 EXPECT_NE(send_codec_spec.format.clockrate_hz, 8000);
1294 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1216 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
1295 EXPECT_EQ(-1, send_codec_spec.cng_payload_type);
1296 EXPECT_FALSE(channel_->CanInsertDtmf()); 1217 EXPECT_FALSE(channel_->CanInsertDtmf());
1297 } 1218 }
1298 1219
1299 // Test that VoE Channel doesn't call SetSendCodec again if same codec is tried 1220 // Test that WebRtcVoiceEngine reconfigures, rather than recreates its
1300 // to apply. 1221 // AudioSendStream.
1301 TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) { 1222 TEST_F(WebRtcVoiceEngineTestFake, DontRecreateSendStream) {
1302 EXPECT_TRUE(SetupSendStream()); 1223 EXPECT_TRUE(SetupSendStream());
1303 cricket::AudioSendParameters parameters; 1224 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kIsacCodec); 1225 parameters.codecs.push_back(kIsacCodec);
1305 parameters.codecs.push_back(kPcmuCodec); 1226 parameters.codecs.push_back(kPcmuCodec);
1306 parameters.codecs.push_back(kCn8000Codec); 1227 parameters.codecs.push_back(kCn8000Codec);
1307 parameters.codecs[0].id = 96; 1228 parameters.codecs[0].id = 96;
1308 parameters.codecs[0].bitrate = 48000; 1229 parameters.codecs[0].bitrate = 48000;
1309 const int initial_num = call_.GetNumCreatedSendStreams(); 1230 const int initial_num = call_.GetNumCreatedSendStreams();
1310 SetSendParameters(parameters); 1231 SetSendParameters(parameters);
1311 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams()); 1232 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1312 // Calling SetSendCodec again with same codec which is already set. 1233 // Calling SetSendCodec again with same codec which is already set.
1313 // In this case media channel shouldn't send codec to VoE. 1234 // In this case media channel shouldn't send codec to VoE.
1314 SetSendParameters(parameters); 1235 SetSendParameters(parameters);
1315 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams()); 1236 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1316 } 1237 }
1317 1238
1318 // Verify that G722 is set with 16000 samples per second to WebRTC. 1239 // TODO(ossu): Revisit if these tests need to be here, now that these kinds of
1319 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) { 1240 // tests should be available in AudioEncoderOpusTest.
1320 EXPECT_TRUE(SetupSendStream());
1321 cricket::AudioSendParameters parameters;
1322 parameters.codecs.push_back(kG722CodecSdp);
1323 SetSendParameters(parameters);
1324 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst;
1325 EXPECT_STREQ("G722", gcodec.plname);
1326 EXPECT_EQ(1, gcodec.channels);
1327 EXPECT_EQ(16000, gcodec.plfreq);
1328 }
1329 1241
1330 // Test that if clockrate is not 48000 for opus, we fail. 1242 // Test that if clockrate is not 48000 for opus, we fail.
1331 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) { 1243 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
1332 EXPECT_TRUE(SetupSendStream()); 1244 EXPECT_TRUE(SetupSendStream());
1333 cricket::AudioSendParameters parameters; 1245 cricket::AudioSendParameters parameters;
1334 parameters.codecs.push_back(kOpusCodec); 1246 parameters.codecs.push_back(kOpusCodec);
1335 parameters.codecs[0].bitrate = 0; 1247 parameters.codecs[0].bitrate = 0;
1336 parameters.codecs[0].clockrate = 50000; 1248 parameters.codecs[0].clockrate = 50000;
1337 EXPECT_FALSE(channel_->SetSendParameters(parameters)); 1249 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1338 } 1250 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) { 1295 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
1384 EXPECT_TRUE(SetupSendStream()); 1296 EXPECT_TRUE(SetupSendStream());
1385 cricket::AudioSendParameters parameters; 1297 cricket::AudioSendParameters parameters;
1386 parameters.codecs.push_back(kOpusCodec); 1298 parameters.codecs.push_back(kOpusCodec);
1387 parameters.codecs[0].bitrate = 0; 1299 parameters.codecs[0].bitrate = 0;
1388 parameters.codecs[0].channels = 1; 1300 parameters.codecs[0].channels = 1;
1389 parameters.codecs[0].params["stereo"] = "1"; 1301 parameters.codecs[0].params["stereo"] = "1";
1390 EXPECT_FALSE(channel_->SetSendParameters(parameters)); 1302 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1391 } 1303 }
1392 1304
1393 // Test that with bitrate=0 and no stereo, 1305 // Test that with bitrate=0 and no stereo, bitrate is 32000.
1394 // channels and bitrate are 1 and 32000.
1395 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) { 1306 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
1396 EXPECT_TRUE(SetupSendStream()); 1307 EXPECT_TRUE(SetupSendStream());
1397 cricket::AudioSendParameters parameters; 1308 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec); 1309 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].bitrate = 0; 1310 parameters.codecs[0].bitrate = 0;
1400 SetSendParameters(parameters); 1311 SetSendParameters(parameters);
1401 CheckSendCodec(kSsrcX, "opus", 1, 32000); 1312 CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1402 } 1313 }
1403 1314
1404 // Test that with bitrate=0 and stereo=0, 1315 // Test that with bitrate=0 and stereo=0, bitrate is 32000.
1405 // channels and bitrate are 1 and 32000.
1406 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) { 1316 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
1407 EXPECT_TRUE(SetupSendStream()); 1317 EXPECT_TRUE(SetupSendStream());
1408 cricket::AudioSendParameters parameters; 1318 cricket::AudioSendParameters parameters;
1409 parameters.codecs.push_back(kOpusCodec); 1319 parameters.codecs.push_back(kOpusCodec);
1410 parameters.codecs[0].bitrate = 0; 1320 parameters.codecs[0].bitrate = 0;
1411 parameters.codecs[0].params["stereo"] = "0"; 1321 parameters.codecs[0].params["stereo"] = "0";
1412 SetSendParameters(parameters); 1322 SetSendParameters(parameters);
1413 CheckSendCodec(kSsrcX, "opus", 1, 32000); 1323 CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1414 } 1324 }
1415 1325
1416 // Test that with bitrate=invalid and stereo=0, 1326 // Test that with bitrate=invalid and stereo=0, bitrate is 32000.
1417 // channels and bitrate are 1 and 32000.
1418 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) { 1327 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
1419 EXPECT_TRUE(SetupSendStream()); 1328 EXPECT_TRUE(SetupSendStream());
1420 cricket::AudioSendParameters parameters; 1329 cricket::AudioSendParameters parameters;
1421 parameters.codecs.push_back(kOpusCodec); 1330 parameters.codecs.push_back(kOpusCodec);
1422 parameters.codecs[0].params["stereo"] = "0"; 1331 parameters.codecs[0].params["stereo"] = "0";
1423 // bitrate that's out of the range between 6000 and 510000 will be clamped. 1332 // bitrate that's out of the range between 6000 and 510000 will be clamped.
1424 parameters.codecs[0].bitrate = 5999; 1333 parameters.codecs[0].bitrate = 5999;
1425 SetSendParameters(parameters); 1334 SetSendParameters(parameters);
1426 CheckSendCodec(kSsrcX, "opus", 1, 6000); 1335 CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1427 1336
1428 parameters.codecs[0].bitrate = 510001; 1337 parameters.codecs[0].bitrate = 510001;
1429 SetSendParameters(parameters); 1338 SetSendParameters(parameters);
1430 CheckSendCodec(kSsrcX, "opus", 1, 510000); 1339 CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1431 } 1340 }
1432 1341
1433 // Test that with bitrate=0 and stereo=1, 1342 // Test that with bitrate=0 and stereo=1, bitrate is 64000.
1434 // channels and bitrate are 2 and 64000.
1435 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) { 1343 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
1436 EXPECT_TRUE(SetupSendStream()); 1344 EXPECT_TRUE(SetupSendStream());
1437 cricket::AudioSendParameters parameters; 1345 cricket::AudioSendParameters parameters;
1438 parameters.codecs.push_back(kOpusCodec); 1346 parameters.codecs.push_back(kOpusCodec);
1439 parameters.codecs[0].bitrate = 0; 1347 parameters.codecs[0].bitrate = 0;
1440 parameters.codecs[0].params["stereo"] = "1"; 1348 parameters.codecs[0].params["stereo"] = "1";
1441 SetSendParameters(parameters); 1349 SetSendParameters(parameters);
1442 CheckSendCodec(kSsrcX, "opus", 2, 64000); 1350 CheckSendCodecBitrate(kSsrcX, "opus", 64000);
1443 } 1351 }
1444 1352
1445 // Test that with bitrate=invalid and stereo=1, 1353 // Test that with bitrate=invalid and stereo=1, bitrate is 64000.
1446 // channels and bitrate are 2 and 64000.
1447 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) { 1354 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
1448 EXPECT_TRUE(SetupSendStream()); 1355 EXPECT_TRUE(SetupSendStream());
1449 cricket::AudioSendParameters parameters; 1356 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kOpusCodec); 1357 parameters.codecs.push_back(kOpusCodec);
1451 parameters.codecs[0].params["stereo"] = "1"; 1358 parameters.codecs[0].params["stereo"] = "1";
1452 // bitrate that's out of the range between 6000 and 510000 will be clamped. 1359 // bitrate that's out of the range between 6000 and 510000 will be clamped.
1453 parameters.codecs[0].bitrate = 5999; 1360 parameters.codecs[0].bitrate = 5999;
1454 SetSendParameters(parameters); 1361 SetSendParameters(parameters);
1455 CheckSendCodec(kSsrcX, "opus", 2, 6000); 1362 CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1456 1363
1457 parameters.codecs[0].bitrate = 510001; 1364 parameters.codecs[0].bitrate = 510001;
1458 SetSendParameters(parameters); 1365 SetSendParameters(parameters);
1459 CheckSendCodec(kSsrcX, "opus", 2, 510000); 1366 CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1460 } 1367 }
1461 1368
1462 // Test that with bitrate=N and stereo unset, 1369 // Test that with bitrate=N and stereo unset, bitrate is N.
1463 // channels and bitrate are 1 and N.
1464 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) { 1370 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
1465 EXPECT_TRUE(SetupSendStream()); 1371 EXPECT_TRUE(SetupSendStream());
1466 cricket::AudioSendParameters parameters; 1372 cricket::AudioSendParameters parameters;
1467 parameters.codecs.push_back(kOpusCodec); 1373 parameters.codecs.push_back(kOpusCodec);
1468 parameters.codecs[0].bitrate = 96000; 1374 parameters.codecs[0].bitrate = 96000;
1469 SetSendParameters(parameters); 1375 SetSendParameters(parameters);
1470 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1376 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1471 EXPECT_EQ(111, gcodec.pltype); 1377 EXPECT_EQ(111, spec.payload_type);
1472 EXPECT_EQ(96000, gcodec.rate); 1378 EXPECT_EQ(96000, spec.target_bitrate_bps);
1473 EXPECT_STREQ("opus", gcodec.plname); 1379 EXPECT_EQ("opus", spec.format.name);
1474 EXPECT_EQ(1, gcodec.channels); 1380 EXPECT_EQ(2, spec.format.num_channels);
1475 EXPECT_EQ(48000, gcodec.plfreq); 1381 EXPECT_EQ(48000, spec.format.clockrate_hz);
1476 } 1382 }
1477 1383
1478 // Test that with bitrate=N and stereo=0, 1384 // Test that with bitrate=N and stereo=0, bitrate is N.
1479 // channels and bitrate are 1 and N.
1480 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) { 1385 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
1481 EXPECT_TRUE(SetupSendStream()); 1386 EXPECT_TRUE(SetupSendStream());
1482 cricket::AudioSendParameters parameters; 1387 cricket::AudioSendParameters parameters;
1483 parameters.codecs.push_back(kOpusCodec); 1388 parameters.codecs.push_back(kOpusCodec);
1484 parameters.codecs[0].bitrate = 30000; 1389 parameters.codecs[0].bitrate = 30000;
1485 parameters.codecs[0].params["stereo"] = "0"; 1390 parameters.codecs[0].params["stereo"] = "0";
1486 SetSendParameters(parameters); 1391 SetSendParameters(parameters);
1487 CheckSendCodec(kSsrcX, "opus", 1, 30000); 1392 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1488 } 1393 }
1489 1394
1490 // Test that with bitrate=N and without any parameters, 1395 // Test that with bitrate=N and without any parameters, bitrate is N.
1491 // channels and bitrate are 1 and N.
1492 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) { 1396 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
1493 EXPECT_TRUE(SetupSendStream()); 1397 EXPECT_TRUE(SetupSendStream());
1494 cricket::AudioSendParameters parameters; 1398 cricket::AudioSendParameters parameters;
1495 parameters.codecs.push_back(kOpusCodec); 1399 parameters.codecs.push_back(kOpusCodec);
1496 parameters.codecs[0].bitrate = 30000; 1400 parameters.codecs[0].bitrate = 30000;
1497 SetSendParameters(parameters); 1401 SetSendParameters(parameters);
1498 CheckSendCodec(kSsrcX, "opus", 1, 30000); 1402 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1499 } 1403 }
1500 1404
1501 // Test that with bitrate=N and stereo=1, 1405 // Test that with bitrate=N and stereo=1, bitrate is N.
1502 // channels and bitrate are 2 and N.
1503 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) { 1406 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
1504 EXPECT_TRUE(SetupSendStream()); 1407 EXPECT_TRUE(SetupSendStream());
1505 cricket::AudioSendParameters parameters; 1408 cricket::AudioSendParameters parameters;
1506 parameters.codecs.push_back(kOpusCodec); 1409 parameters.codecs.push_back(kOpusCodec);
1507 parameters.codecs[0].bitrate = 30000; 1410 parameters.codecs[0].bitrate = 30000;
1508 parameters.codecs[0].params["stereo"] = "1"; 1411 parameters.codecs[0].params["stereo"] = "1";
1509 SetSendParameters(parameters); 1412 SetSendParameters(parameters);
1510 CheckSendCodec(kSsrcX, "opus", 2, 30000); 1413 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1511 }
1512
1513 // Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1514 // Also test that the "maxaveragebitrate" can't be set to values outside the
1515 // range of 6000 and 510000
1516 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
1517 EXPECT_TRUE(SetupSendStream());
1518 cricket::AudioSendParameters parameters;
1519 parameters.codecs.push_back(kOpusCodec);
1520 parameters.codecs[0].bitrate = 30000;
1521 // Ignore if less than 6000.
1522 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1523 SetSendParameters(parameters);
1524 EXPECT_EQ(6000, GetCodecBitrate(kSsrcX));
1525
1526 // Ignore if larger than 510000.
1527 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1528 SetSendParameters(parameters);
1529 EXPECT_EQ(510000, GetCodecBitrate(kSsrcX));
1530
1531 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1532 SetSendParameters(parameters);
1533 EXPECT_EQ(200000, GetCodecBitrate(kSsrcX));
1534 } 1414 }
1535 1415
1536 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) { 1416 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1537 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200", 1417 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1538 200000); 1418 200000);
1539 } 1419 }
1540 1420
1541 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) { 1421 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1542 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000); 1422 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1543 } 1423 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1659 cricket::kParamValueEmpty)); 1539 cricket::kParamValueEmpty));
1660 SetSendParameters(parameters); 1540 SetSendParameters(parameters);
1661 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms); 1541 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
1662 1542
1663 EXPECT_TRUE(AddRecvStream(kSsrcY)); 1543 EXPECT_TRUE(AddRecvStream(kSsrcY));
1664 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms); 1544 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1665 EXPECT_TRUE(AddRecvStream(kSsrcZ)); 1545 EXPECT_TRUE(AddRecvStream(kSsrcZ));
1666 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms); 1546 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms);
1667 } 1547 }
1668 1548
1669 // Test that without useinbandfec, Opus FEC is off.
1670 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
1671 EXPECT_TRUE(SetupSendStream());
1672 cricket::AudioSendParameters parameters;
1673 parameters.codecs.push_back(kOpusCodec);
1674 SetSendParameters(parameters);
1675 EXPECT_FALSE(GetCodecFec(kSsrcX));
1676 }
1677
1678 // Test that with useinbandfec=0, Opus FEC is off.
1679 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
1680 EXPECT_TRUE(SetupSendStream());
1681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].bitrate = 0;
1684 parameters.codecs[0].params["useinbandfec"] = "0";
1685 SetSendParameters(parameters);
1686 CheckSendCodec(kSsrcX, "opus", 1, 32000);
1687 }
1688
1689 // Test that with useinbandfec=1, Opus FEC is on.
1690 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
1691 EXPECT_TRUE(SetupSendStream());
1692 cricket::AudioSendParameters parameters;
1693 parameters.codecs.push_back(kOpusCodec);
1694 parameters.codecs[0].bitrate = 0;
1695 parameters.codecs[0].params["useinbandfec"] = "1";
1696 SetSendParameters(parameters);
1697 EXPECT_TRUE(GetCodecFec(kSsrcX));
1698 CheckSendCodec(kSsrcX, "opus", 1, 32000);
1699 }
1700
1701 // Test that with useinbandfec=1, stereo=1, Opus FEC is on.
1702 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
1703 EXPECT_TRUE(SetupSendStream());
1704 cricket::AudioSendParameters parameters;
1705 parameters.codecs.push_back(kOpusCodec);
1706 parameters.codecs[0].bitrate = 0;
1707 parameters.codecs[0].params["stereo"] = "1";
1708 parameters.codecs[0].params["useinbandfec"] = "1";
1709 SetSendParameters(parameters);
1710 EXPECT_TRUE(GetCodecFec(kSsrcX));
1711 CheckSendCodec(kSsrcX, "opus", 2, 64000);
1712 }
1713
1714 // Test that with non-Opus, codec FEC is off.
1715 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
1716 EXPECT_TRUE(SetupSendStream());
1717 cricket::AudioSendParameters parameters;
1718 parameters.codecs.push_back(kIsacCodec);
1719 SetSendParameters(parameters);
1720 EXPECT_FALSE(GetCodecFec(kSsrcX));
1721 }
1722
1723 // Test the with non-Opus, even if useinbandfec=1, FEC is off.
1724 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1725 EXPECT_TRUE(SetupSendStream());
1726 cricket::AudioSendParameters parameters;
1727 parameters.codecs.push_back(kIsacCodec);
1728 parameters.codecs[0].params["useinbandfec"] = "1";
1729 SetSendParameters(parameters);
1730 EXPECT_FALSE(GetCodecFec(kSsrcX));
1731 }
1732
1733 // Test that Opus FEC status can be changed.
1734 TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1735 EXPECT_TRUE(SetupSendStream());
1736 cricket::AudioSendParameters parameters;
1737 parameters.codecs.push_back(kOpusCodec);
1738 SetSendParameters(parameters);
1739 EXPECT_FALSE(GetCodecFec(kSsrcX));
1740
1741 parameters.codecs[0].params["useinbandfec"] = "1";
1742 SetSendParameters(parameters);
1743 EXPECT_TRUE(GetCodecFec(kSsrcX));
1744 }
1745
1746 TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) { 1549 TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1747 EXPECT_TRUE(SetupChannel()); 1550 EXPECT_TRUE(SetupChannel());
1748 cricket::AudioSendParameters send_parameters; 1551 cricket::AudioSendParameters send_parameters;
1749 send_parameters.codecs.push_back(kOpusCodec); 1552 send_parameters.codecs.push_back(kOpusCodec);
1750 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty()); 1553 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1751 SetSendParameters(send_parameters); 1554 SetSendParameters(send_parameters);
1752 1555
1753 cricket::AudioRecvParameters recv_parameters; 1556 cricket::AudioRecvParameters recv_parameters;
1754 recv_parameters.codecs.push_back(kIsacCodec); 1557 recv_parameters.codecs.push_back(kIsacCodec);
1755 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters)); 1558 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1756 EXPECT_TRUE(AddRecvStream(kSsrcX)); 1559 EXPECT_TRUE(AddRecvStream(kSsrcX));
1757 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr); 1560 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1758 EXPECT_FALSE( 1561 EXPECT_FALSE(
1759 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc); 1562 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc);
1760 1563
1761 send_parameters.codecs = engine_->send_codecs(); 1564 send_parameters.codecs = engine_->send_codecs();
1762 SetSendParameters(send_parameters); 1565 SetSendParameters(send_parameters);
1763 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr); 1566 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1764 EXPECT_TRUE( 1567 EXPECT_TRUE(
1765 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc); 1568 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc);
1766 } 1569 }
1767 1570
1768 // Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1769 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1770 EXPECT_TRUE(SetupSendStream());
1771 cricket::AudioSendParameters parameters;
1772 parameters.codecs.push_back(kOpusCodec);
1773 parameters.codecs[0].bitrate = 0;
1774 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1775 SetSendParameters(parameters);
1776 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrcX));
1777 EXPECT_EQ(12000, GetCodecBitrate(kSsrcX));
1778
1779 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1780 SetSendParameters(parameters);
1781 EXPECT_EQ(24000, GetCodecBitrate(kSsrcX));
1782 }
1783
1784 // Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1785 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1786 EXPECT_TRUE(SetupSendStream());
1787 cricket::AudioSendParameters parameters;
1788 parameters.codecs.push_back(kOpusCodec);
1789 parameters.codecs[0].bitrate = 0;
1790 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1791 SetSendParameters(parameters);
1792 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrcX));
1793 EXPECT_EQ(20000, GetCodecBitrate(kSsrcX));
1794
1795 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1796 SetSendParameters(parameters);
1797 EXPECT_EQ(40000, GetCodecBitrate(kSsrcX));
1798 }
1799
1800 // Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1801 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1802 EXPECT_TRUE(SetupSendStream());
1803 cricket::AudioSendParameters parameters;
1804 parameters.codecs.push_back(kOpusCodec);
1805 parameters.codecs[0].bitrate = 0;
1806 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1807 SetSendParameters(parameters);
1808 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrcX));
1809 EXPECT_EQ(20000, GetCodecBitrate(kSsrcX));
1810
1811 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1812 SetSendParameters(parameters);
1813 EXPECT_EQ(40000, GetCodecBitrate(kSsrcX));
1814 }
1815
1816 // Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1817 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1818 EXPECT_TRUE(SetupSendStream());
1819 cricket::AudioSendParameters parameters;
1820 parameters.codecs.push_back(kOpusCodec);
1821 parameters.codecs[0].bitrate = 0;
1822 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1823 SetSendParameters(parameters);
1824 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrcX));
1825 EXPECT_EQ(32000, GetCodecBitrate(kSsrcX));
1826
1827 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1828 SetSendParameters(parameters);
1829 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1830 }
1831
1832 // Test 24000 < maxplaybackrate triggers Opus full band mode.
1833 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1834 EXPECT_TRUE(SetupSendStream());
1835 cricket::AudioSendParameters parameters;
1836 parameters.codecs.push_back(kOpusCodec);
1837 parameters.codecs[0].bitrate = 0;
1838 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1839 SetSendParameters(parameters);
1840 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrcX));
1841 EXPECT_EQ(32000, GetCodecBitrate(kSsrcX));
1842
1843 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1844 SetSendParameters(parameters);
1845 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1846 }
1847
1848 // Test Opus that without maxplaybackrate, default playback rate is used.
1849 TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1850 EXPECT_TRUE(SetupSendStream());
1851 cricket::AudioSendParameters parameters;
1852 parameters.codecs.push_back(kOpusCodec);
1853 SetSendParameters(parameters);
1854 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrcX));
1855 }
1856
1857 // Test the with non-Opus, maxplaybackrate has no effect.
1858 TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
1859 EXPECT_TRUE(SetupSendStream());
1860 cricket::AudioSendParameters parameters;
1861 parameters.codecs.push_back(kIsacCodec);
1862 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1863 SetSendParameters(parameters);
1864 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrcX));
1865 }
1866
1867 // Test maxplaybackrate can be set on two streams.
1868 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1869 EXPECT_TRUE(SetupSendStream());
1870 cricket::AudioSendParameters parameters;
1871 parameters.codecs.push_back(kOpusCodec);
1872 SetSendParameters(parameters);
1873 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrcX));
1874
1875 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1876 SetSendParameters(parameters);
1877 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrcX));
1878
1879 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcY));
1880 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrcY));
1881 }
1882
1883 // Test that with usedtx=0, Opus DTX is off.
1884 TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
1885 EXPECT_TRUE(SetupSendStream());
1886 cricket::AudioSendParameters parameters;
1887 parameters.codecs.push_back(kOpusCodec);
1888 parameters.codecs[0].params["usedtx"] = "0";
1889 SetSendParameters(parameters);
1890 EXPECT_FALSE(GetOpusDtx(kSsrcX));
1891 }
1892
1893 // Test that with usedtx=1, Opus DTX is on.
1894 TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
1895 EXPECT_TRUE(SetupSendStream());
1896 cricket::AudioSendParameters parameters;
1897 parameters.codecs.push_back(kOpusCodec);
1898 parameters.codecs[0].params["usedtx"] = "1";
1899 SetSendParameters(parameters);
1900 EXPECT_TRUE(GetOpusDtx(kSsrcX));
1901 }
1902
1903 // Test that usedtx=1 works with stereo Opus.
1904 TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
1905 EXPECT_TRUE(SetupSendStream());
1906 cricket::AudioSendParameters parameters;
1907 parameters.codecs.push_back(kOpusCodec);
1908 parameters.codecs[0].params["usedtx"] = "1";
1909 parameters.codecs[0].params["stereo"] = "1";
1910 SetSendParameters(parameters);
1911 EXPECT_TRUE(GetOpusDtx(kSsrcX));
1912 }
1913
1914 // Test that usedtx=1 does not work with non Opus.
1915 TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
1916 EXPECT_TRUE(SetupSendStream());
1917 cricket::AudioSendParameters parameters;
1918 parameters.codecs.push_back(kIsacCodec);
1919 parameters.codecs[0].params["usedtx"] = "1";
1920 SetSendParameters(parameters);
1921 EXPECT_FALSE(GetOpusDtx(kSsrcX));
1922 }
1923
1924 // Test that we can switch back and forth between Opus and ISAC with CN. 1571 // Test that we can switch back and forth between Opus and ISAC with CN.
1925 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) { 1572 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
1926 EXPECT_TRUE(SetupSendStream()); 1573 EXPECT_TRUE(SetupSendStream());
1927 1574
1928 cricket::AudioSendParameters opus_parameters; 1575 cricket::AudioSendParameters opus_parameters;
1929 opus_parameters.codecs.push_back(kOpusCodec); 1576 opus_parameters.codecs.push_back(kOpusCodec);
1930 SetSendParameters(opus_parameters); 1577 SetSendParameters(opus_parameters);
1931 { 1578 {
1932 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1579 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1933 EXPECT_EQ(111, gcodec.pltype); 1580 EXPECT_EQ(111, spec.payload_type);
1934 EXPECT_STREQ("opus", gcodec.plname); 1581 EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1935 } 1582 }
1936 1583
1937 cricket::AudioSendParameters isac_parameters; 1584 cricket::AudioSendParameters isac_parameters;
1938 isac_parameters.codecs.push_back(kIsacCodec); 1585 isac_parameters.codecs.push_back(kIsacCodec);
1939 isac_parameters.codecs.push_back(kCn16000Codec); 1586 isac_parameters.codecs.push_back(kCn16000Codec);
1940 isac_parameters.codecs.push_back(kOpusCodec); 1587 isac_parameters.codecs.push_back(kOpusCodec);
1941 SetSendParameters(isac_parameters); 1588 SetSendParameters(isac_parameters);
1942 { 1589 {
1943 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1590 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1944 EXPECT_EQ(103, gcodec.pltype); 1591 EXPECT_EQ(103, spec.payload_type);
1945 EXPECT_STREQ("ISAC", gcodec.plname); 1592 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1946 } 1593 }
1947 1594
1948 SetSendParameters(opus_parameters); 1595 SetSendParameters(opus_parameters);
1949 { 1596 {
1950 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1597 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1951 EXPECT_EQ(111, gcodec.pltype); 1598 EXPECT_EQ(111, spec.payload_type);
1952 EXPECT_STREQ("opus", gcodec.plname); 1599 EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1953 } 1600 }
1954 } 1601 }
1955 1602
1956 // Test that we handle various ways of specifying bitrate. 1603 // Test that we handle various ways of specifying bitrate.
1957 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) { 1604 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1958 EXPECT_TRUE(SetupSendStream()); 1605 EXPECT_TRUE(SetupSendStream());
1959 cricket::AudioSendParameters parameters; 1606 cricket::AudioSendParameters parameters;
1960 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000 1607 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1961 SetSendParameters(parameters); 1608 SetSendParameters(parameters);
1962 { 1609 {
1963 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1610 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1964 EXPECT_EQ(103, gcodec.pltype); 1611 EXPECT_EQ(103, spec.payload_type);
1965 EXPECT_STREQ("ISAC", gcodec.plname); 1612 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1966 EXPECT_EQ(32000, gcodec.rate); 1613 EXPECT_EQ(32000, spec.target_bitrate_bps);
1967 } 1614 }
1968 1615
1969 parameters.codecs[0].bitrate = 0; // bitrate == default 1616 parameters.codecs[0].bitrate = 0; // bitrate == default
1970 SetSendParameters(parameters); 1617 SetSendParameters(parameters);
1971 { 1618 {
1972 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1619 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1973 EXPECT_EQ(103, gcodec.pltype); 1620 EXPECT_EQ(103, spec.payload_type);
1974 EXPECT_STREQ("ISAC", gcodec.plname); 1621 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1975 EXPECT_EQ(32000, gcodec.rate); 1622 EXPECT_EQ(32000, spec.target_bitrate_bps);
1976 } 1623 }
1977 parameters.codecs[0].bitrate = 28000; // bitrate == 28000 1624 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1978 SetSendParameters(parameters); 1625 SetSendParameters(parameters);
1979 { 1626 {
1980 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1627 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1981 EXPECT_EQ(103, gcodec.pltype); 1628 EXPECT_EQ(103, spec.payload_type);
1982 EXPECT_STREQ("ISAC", gcodec.plname); 1629 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1983 EXPECT_EQ(28000, gcodec.rate); 1630 EXPECT_EQ(28000, spec.target_bitrate_bps);
1984 } 1631 }
1985 1632
1986 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000 1633 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1987 SetSendParameters(parameters); 1634 SetSendParameters(parameters);
1988 { 1635 {
1989 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1636 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1990 EXPECT_EQ(0, gcodec.pltype); 1637 EXPECT_EQ(0, spec.payload_type);
1991 EXPECT_STREQ("PCMU", gcodec.plname); 1638 EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
1992 EXPECT_EQ(64000, gcodec.rate); 1639 EXPECT_EQ(64000, spec.target_bitrate_bps);
1993 } 1640 }
1994 1641
1995 parameters.codecs[0].bitrate = 0; // bitrate == default 1642 parameters.codecs[0].bitrate = 0; // bitrate == default
1996 SetSendParameters(parameters); 1643 SetSendParameters(parameters);
1997 { 1644 {
1998 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1645 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1999 EXPECT_EQ(0, gcodec.pltype); 1646 EXPECT_EQ(0, spec.payload_type);
2000 EXPECT_STREQ("PCMU", gcodec.plname); 1647 EXPECT_STREQ("PCMU", spec.format.name.c_str());
2001 EXPECT_EQ(64000, gcodec.rate); 1648 EXPECT_EQ(64000, spec.target_bitrate_bps);
2002 } 1649 }
2003 1650
2004 parameters.codecs[0] = kOpusCodec; 1651 parameters.codecs[0] = kOpusCodec;
2005 parameters.codecs[0].bitrate = 0; // bitrate == default 1652 parameters.codecs[0].bitrate = 0; // bitrate == default
2006 SetSendParameters(parameters); 1653 SetSendParameters(parameters);
2007 { 1654 {
2008 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1655 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2009 EXPECT_EQ(111, gcodec.pltype); 1656 EXPECT_EQ(111, spec.payload_type);
2010 EXPECT_STREQ("opus", gcodec.plname); 1657 EXPECT_STREQ("opus", spec.format.name.c_str());
2011 EXPECT_EQ(32000, gcodec.rate); 1658 EXPECT_EQ(32000, spec.target_bitrate_bps);
2012 } 1659 }
2013 } 1660 }
2014 1661
2015 // Test that we could set packet size specified in kCodecParamPTime.
2016 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
2017 EXPECT_TRUE(SetupSendStream());
2018 cricket::AudioSendParameters parameters;
2019 parameters.codecs.push_back(kOpusCodec);
2020 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
2021 SetSendParameters(parameters);
2022 EXPECT_EQ(1920, GetCodecPacSize(kSsrcX)); // Opus gets 40ms.
2023
2024 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
2025 SetSendParameters(parameters);
2026 EXPECT_EQ(480, GetCodecPacSize(kSsrcX)); // Opus gets 10ms.
2027
2028 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
2029 SetSendParameters(parameters);
2030 EXPECT_EQ(2880, GetCodecPacSize(kSsrcX)); // Opus gets 60ms.
2031
2032 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
2033 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
2034 SetSendParameters(parameters);
2035 EXPECT_EQ(480, GetCodecPacSize(
2036 kSsrcX)); // Isac gets 30ms as the next smallest value.
2037
2038 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
2039 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
2040 SetSendParameters(parameters);
2041 EXPECT_EQ(640, GetCodecPacSize(
2042 kSsrcX)); // G722 gets 40ms @16kHz as defined in VoE.
2043 }
2044
2045 // Test that we fail if no codecs are specified. 1662 // Test that we fail if no codecs are specified.
2046 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) { 1663 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
2047 EXPECT_TRUE(SetupSendStream()); 1664 EXPECT_TRUE(SetupSendStream());
2048 cricket::AudioSendParameters parameters; 1665 cricket::AudioSendParameters parameters;
2049 EXPECT_FALSE(channel_->SetSendParameters(parameters)); 1666 EXPECT_FALSE(channel_->SetSendParameters(parameters));
2050 } 1667 }
2051 1668
2052 // Test that we can set send codecs even with telephone-event codec as the first 1669 // Test that we can set send codecs even with telephone-event codec as the first
2053 // one on the list. 1670 // one on the list.
2054 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) { 1671 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
2055 EXPECT_TRUE(SetupSendStream()); 1672 EXPECT_TRUE(SetupSendStream());
2056 cricket::AudioSendParameters parameters; 1673 cricket::AudioSendParameters parameters;
2057 parameters.codecs.push_back(kTelephoneEventCodec1); 1674 parameters.codecs.push_back(kTelephoneEventCodec1);
2058 parameters.codecs.push_back(kIsacCodec); 1675 parameters.codecs.push_back(kIsacCodec);
2059 parameters.codecs.push_back(kPcmuCodec); 1676 parameters.codecs.push_back(kPcmuCodec);
2060 parameters.codecs[0].id = 98; // DTMF 1677 parameters.codecs[0].id = 98; // DTMF
2061 parameters.codecs[1].id = 96; 1678 parameters.codecs[1].id = 96;
2062 SetSendParameters(parameters); 1679 SetSendParameters(parameters);
2063 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1680 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2064 EXPECT_EQ(96, gcodec.pltype); 1681 EXPECT_EQ(96, spec.payload_type);
2065 EXPECT_STREQ("ISAC", gcodec.plname); 1682 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
2066 EXPECT_TRUE(channel_->CanInsertDtmf()); 1683 EXPECT_TRUE(channel_->CanInsertDtmf());
2067 } 1684 }
2068 1685
2069 // Test that payload type range is limited for telephone-event codec. 1686 // Test that payload type range is limited for telephone-event codec.
2070 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) { 1687 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
2071 EXPECT_TRUE(SetupSendStream()); 1688 EXPECT_TRUE(SetupSendStream());
2072 cricket::AudioSendParameters parameters; 1689 cricket::AudioSendParameters parameters;
2073 parameters.codecs.push_back(kTelephoneEventCodec2); 1690 parameters.codecs.push_back(kTelephoneEventCodec2);
2074 parameters.codecs.push_back(kIsacCodec); 1691 parameters.codecs.push_back(kIsacCodec);
2075 parameters.codecs[0].id = 0; // DTMF 1692 parameters.codecs[0].id = 0; // DTMF
(...skipping 15 matching lines...) Expand all
2091 // one on the list. 1708 // one on the list.
2092 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) { 1709 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
2093 EXPECT_TRUE(SetupSendStream()); 1710 EXPECT_TRUE(SetupSendStream());
2094 cricket::AudioSendParameters parameters; 1711 cricket::AudioSendParameters parameters;
2095 parameters.codecs.push_back(kCn16000Codec); 1712 parameters.codecs.push_back(kCn16000Codec);
2096 parameters.codecs.push_back(kIsacCodec); 1713 parameters.codecs.push_back(kIsacCodec);
2097 parameters.codecs.push_back(kPcmuCodec); 1714 parameters.codecs.push_back(kPcmuCodec);
2098 parameters.codecs[0].id = 98; // wideband CN 1715 parameters.codecs[0].id = 98; // wideband CN
2099 parameters.codecs[1].id = 96; 1716 parameters.codecs[1].id = 96;
2100 SetSendParameters(parameters); 1717 SetSendParameters(parameters);
2101 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1718 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2102 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1719 EXPECT_EQ(96, send_codec_spec.payload_type);
2103 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1720 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2104 EXPECT_EQ(98, send_codec_spec.cng_payload_type); 1721 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2105 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2106 } 1722 }
2107 1723
2108 // Test that we set VAD and DTMF types correctly as caller. 1724 // Test that we set VAD and DTMF types correctly as caller.
2109 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) { 1725 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
2110 EXPECT_TRUE(SetupSendStream()); 1726 EXPECT_TRUE(SetupSendStream());
2111 cricket::AudioSendParameters parameters; 1727 cricket::AudioSendParameters parameters;
2112 parameters.codecs.push_back(kIsacCodec); 1728 parameters.codecs.push_back(kIsacCodec);
2113 parameters.codecs.push_back(kPcmuCodec); 1729 parameters.codecs.push_back(kPcmuCodec);
2114 // TODO(juberti): cn 32000 1730 // TODO(juberti): cn 32000
2115 parameters.codecs.push_back(kCn16000Codec); 1731 parameters.codecs.push_back(kCn16000Codec);
2116 parameters.codecs.push_back(kCn8000Codec); 1732 parameters.codecs.push_back(kCn8000Codec);
2117 parameters.codecs.push_back(kTelephoneEventCodec1); 1733 parameters.codecs.push_back(kTelephoneEventCodec1);
2118 parameters.codecs[0].id = 96; 1734 parameters.codecs[0].id = 96;
2119 parameters.codecs[2].id = 97; // wideband CN 1735 parameters.codecs[2].id = 97; // wideband CN
2120 parameters.codecs[4].id = 98; // DTMF 1736 parameters.codecs[4].id = 98; // DTMF
2121 SetSendParameters(parameters); 1737 SetSendParameters(parameters);
2122 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1738 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2123 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1739 EXPECT_EQ(96, send_codec_spec.payload_type);
2124 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1740 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2125 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1741 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2126 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2127 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1742 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2128 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2129 EXPECT_TRUE(channel_->CanInsertDtmf()); 1743 EXPECT_TRUE(channel_->CanInsertDtmf());
2130 } 1744 }
2131 1745
2132 // Test that we set VAD and DTMF types correctly as callee. 1746 // Test that we set VAD and DTMF types correctly as callee.
2133 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) { 1747 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
2134 EXPECT_TRUE(SetupChannel()); 1748 EXPECT_TRUE(SetupChannel());
2135 cricket::AudioSendParameters parameters; 1749 cricket::AudioSendParameters parameters;
2136 parameters.codecs.push_back(kIsacCodec); 1750 parameters.codecs.push_back(kIsacCodec);
2137 parameters.codecs.push_back(kPcmuCodec); 1751 parameters.codecs.push_back(kPcmuCodec);
2138 // TODO(juberti): cn 32000 1752 // TODO(juberti): cn 32000
2139 parameters.codecs.push_back(kCn16000Codec); 1753 parameters.codecs.push_back(kCn16000Codec);
2140 parameters.codecs.push_back(kCn8000Codec); 1754 parameters.codecs.push_back(kCn8000Codec);
2141 parameters.codecs.push_back(kTelephoneEventCodec2); 1755 parameters.codecs.push_back(kTelephoneEventCodec2);
2142 parameters.codecs[0].id = 96; 1756 parameters.codecs[0].id = 96;
2143 parameters.codecs[2].id = 97; // wideband CN 1757 parameters.codecs[2].id = 97; // wideband CN
2144 parameters.codecs[4].id = 98; // DTMF 1758 parameters.codecs[4].id = 98; // DTMF
2145 SetSendParameters(parameters); 1759 SetSendParameters(parameters);
2146 EXPECT_TRUE(channel_->AddSendStream( 1760 EXPECT_TRUE(channel_->AddSendStream(
2147 cricket::StreamParams::CreateLegacy(kSsrcX))); 1761 cricket::StreamParams::CreateLegacy(kSsrcX)));
2148 1762
2149 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1763 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2150 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1764 EXPECT_EQ(96, send_codec_spec.payload_type);
2151 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1765 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2152 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1766 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2153 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2154 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1767 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2155 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2156 EXPECT_TRUE(channel_->CanInsertDtmf()); 1768 EXPECT_TRUE(channel_->CanInsertDtmf());
2157 } 1769 }
2158 1770
2159 // Test that we only apply VAD if we have a CN codec that matches the 1771 // Test that we only apply VAD if we have a CN codec that matches the
2160 // send codec clockrate. 1772 // send codec clockrate.
2161 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) { 1773 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
2162 EXPECT_TRUE(SetupSendStream()); 1774 EXPECT_TRUE(SetupSendStream());
2163 cricket::AudioSendParameters parameters; 1775 cricket::AudioSendParameters parameters;
2164 // Set ISAC(16K) and CN(16K). VAD should be activated. 1776 // Set ISAC(16K) and CN(16K). VAD should be activated.
2165 parameters.codecs.push_back(kIsacCodec); 1777 parameters.codecs.push_back(kIsacCodec);
2166 parameters.codecs.push_back(kCn16000Codec); 1778 parameters.codecs.push_back(kCn16000Codec);
2167 parameters.codecs[1].id = 97; 1779 parameters.codecs[1].id = 97;
2168 SetSendParameters(parameters); 1780 SetSendParameters(parameters);
2169 { 1781 {
2170 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1782 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2171 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1783 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2172 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1784 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2173 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2174 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1785 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2175 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2176 } 1786 }
2177 // Set PCMU(8K) and CN(16K). VAD should not be activated. 1787 // Set PCMU(8K) and CN(16K). VAD should not be activated.
2178 parameters.codecs[0] = kPcmuCodec; 1788 parameters.codecs[0] = kPcmuCodec;
2179 SetSendParameters(parameters); 1789 SetSendParameters(parameters);
2180 { 1790 {
2181 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1791 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2182 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname); 1792 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2183 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1793 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
2184 } 1794 }
2185 // Set PCMU(8K) and CN(8K). VAD should be activated. 1795 // Set PCMU(8K) and CN(8K). VAD should be activated.
2186 parameters.codecs[1] = kCn8000Codec; 1796 parameters.codecs[1] = kCn8000Codec;
2187 SetSendParameters(parameters); 1797 SetSendParameters(parameters);
2188 { 1798 {
2189 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1799 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2190 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname); 1800 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2191 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1801 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2192 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2193 EXPECT_EQ(13, send_codec_spec.cng_payload_type); 1802 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2194 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2195 } 1803 }
2196 // Set ISAC(16K) and CN(8K). VAD should not be activated. 1804 // Set ISAC(16K) and CN(8K). VAD should not be activated.
2197 parameters.codecs[0] = kIsacCodec; 1805 parameters.codecs[0] = kIsacCodec;
2198 SetSendParameters(parameters); 1806 SetSendParameters(parameters);
2199 { 1807 {
2200 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1808 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2201 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1809 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2202 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1810 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
2203 } 1811 }
2204 } 1812 }
2205 1813
2206 // Test that we perform case-insensitive matching of codec names. 1814 // Test that we perform case-insensitive matching of codec names.
2207 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) { 1815 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
2208 EXPECT_TRUE(SetupSendStream()); 1816 EXPECT_TRUE(SetupSendStream());
2209 cricket::AudioSendParameters parameters; 1817 cricket::AudioSendParameters parameters;
2210 parameters.codecs.push_back(kIsacCodec); 1818 parameters.codecs.push_back(kIsacCodec);
2211 parameters.codecs.push_back(kPcmuCodec); 1819 parameters.codecs.push_back(kPcmuCodec);
2212 parameters.codecs.push_back(kCn16000Codec); 1820 parameters.codecs.push_back(kCn16000Codec);
2213 parameters.codecs.push_back(kCn8000Codec); 1821 parameters.codecs.push_back(kCn8000Codec);
2214 parameters.codecs.push_back(kTelephoneEventCodec1); 1822 parameters.codecs.push_back(kTelephoneEventCodec1);
2215 parameters.codecs[0].name = "iSaC"; 1823 parameters.codecs[0].name = "iSaC";
2216 parameters.codecs[0].id = 96; 1824 parameters.codecs[0].id = 96;
2217 parameters.codecs[2].id = 97; // wideband CN 1825 parameters.codecs[2].id = 97; // wideband CN
2218 parameters.codecs[4].id = 98; // DTMF 1826 parameters.codecs[4].id = 98; // DTMF
2219 SetSendParameters(parameters); 1827 SetSendParameters(parameters);
2220 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1828 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2221 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1829 EXPECT_EQ(96, send_codec_spec.payload_type);
2222 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1830 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2223 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1831 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2224 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2225 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1832 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2226 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2227 EXPECT_TRUE(channel_->CanInsertDtmf()); 1833 EXPECT_TRUE(channel_->CanInsertDtmf());
2228 } 1834 }
2229 1835
2230 class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake { 1836 class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2231 public: 1837 public:
2232 WebRtcVoiceEngineWithSendSideBweTest() 1838 WebRtcVoiceEngineWithSendSideBweTest()
2233 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {} 1839 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2234 }; 1840 };
2235 1841
2236 TEST_F(WebRtcVoiceEngineWithSendSideBweTest, 1842 TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2374 // Set ISAC(16K) and CN(16K). VAD should be activated. 1980 // Set ISAC(16K) and CN(16K). VAD should be activated.
2375 parameters.codecs.push_back(kIsacCodec); 1981 parameters.codecs.push_back(kIsacCodec);
2376 parameters.codecs.push_back(kCn16000Codec); 1982 parameters.codecs.push_back(kCn16000Codec);
2377 parameters.codecs[1].id = 97; 1983 parameters.codecs[1].id = 97;
2378 SetSendParameters(parameters); 1984 SetSendParameters(parameters);
2379 1985
2380 // Verify ISAC and VAD are corrected configured on all send channels. 1986 // Verify ISAC and VAD are corrected configured on all send channels.
2381 for (uint32_t ssrc : kSsrcs4) { 1987 for (uint32_t ssrc : kSsrcs4) {
2382 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr); 1988 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2383 const auto& send_codec_spec = 1989 const auto& send_codec_spec =
2384 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec; 1990 *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2385 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1991 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2386 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1992 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2387 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2388 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1993 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2389 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2390 } 1994 }
2391 1995
2392 // Change to PCMU(8K) and CN(16K). 1996 // Change to PCMU(8K) and CN(16K).
2393 parameters.codecs[0] = kPcmuCodec; 1997 parameters.codecs[0] = kPcmuCodec;
2394 SetSendParameters(parameters); 1998 SetSendParameters(parameters);
2395 for (uint32_t ssrc : kSsrcs4) { 1999 for (uint32_t ssrc : kSsrcs4) {
2396 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr); 2000 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2397 const auto& send_codec_spec = 2001 const auto& send_codec_spec =
2398 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec; 2002 *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2399 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname); 2003 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2400 EXPECT_EQ(-1, send_codec_spec.cng_payload_type); 2004 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
2401 } 2005 }
2402 } 2006 }
2403 2007
2404 // Test we can SetSend on all send streams correctly. 2008 // Test we can SetSend on all send streams correctly.
2405 TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) { 2009 TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2406 SetupForMultiSendStream(); 2010 SetupForMultiSendStream();
2407 2011
2408 // Create the send channels and they should be a "not sending" date. 2012 // Create the send channels and they should be a "not sending" date.
2409 for (uint32_t ssrc : kSsrcs4) { 2013 for (uint32_t ssrc : kSsrcs4) {
2410 EXPECT_TRUE(channel_->AddSendStream( 2014 EXPECT_TRUE(channel_->AddSendStream(
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2586 } 2190 }
2587 2191
2588 TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) { 2192 TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2589 EXPECT_TRUE(SetupSendStream()); 2193 EXPECT_TRUE(SetupSendStream());
2590 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true); 2194 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2591 send_parameters_.options.audio_network_adaptor_config = 2195 send_parameters_.options.audio_network_adaptor_config =
2592 rtc::Optional<std::string>("1234"); 2196 rtc::Optional<std::string>("1234");
2593 SetSendParameters(send_parameters_); 2197 SetSendParameters(send_parameters_);
2594 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config, 2198 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2595 GetAudioNetworkAdaptorConfig(kSsrcX)); 2199 GetAudioNetworkAdaptorConfig(kSsrcX));
2596 const int initial_num = call_.GetNumCreatedSendStreams();
2597 cricket::AudioOptions options; 2200 cricket::AudioOptions options;
2598 options.audio_network_adaptor = rtc::Optional<bool>(false); 2201 options.audio_network_adaptor = rtc::Optional<bool>(false);
2599 SetAudioSend(kSsrcX, true, nullptr, &options); 2202 SetAudioSend(kSsrcX, true, nullptr, &options);
2600 // AudioSendStream expected to be recreated.
2601 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2602 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrcX)); 2203 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrcX));
2603 } 2204 }
2604 2205
2605 TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) { 2206 TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2606 EXPECT_TRUE(SetupSendStream()); 2207 EXPECT_TRUE(SetupSendStream());
2607 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true); 2208 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2608 send_parameters_.options.audio_network_adaptor_config = 2209 send_parameters_.options.audio_network_adaptor_config =
2609 rtc::Optional<std::string>("1234"); 2210 rtc::Optional<std::string>("1234");
2610 SetSendParameters(send_parameters_); 2211 SetSendParameters(send_parameters_);
2611 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config, 2212 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
3664 webrtc::RtcEventLogNullImpl event_log; 3265 webrtc::RtcEventLogNullImpl event_log;
3665 std::unique_ptr<webrtc::Call> call( 3266 std::unique_ptr<webrtc::Call> call(
3666 webrtc::Call::Create(webrtc::Call::Config(&event_log))); 3267 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
3667 cricket::VoiceMediaChannel* channel = engine.CreateChannel( 3268 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3668 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); 3269 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3669 EXPECT_TRUE(channel != nullptr); 3270 EXPECT_TRUE(channel != nullptr);
3670 delete channel; 3271 delete channel;
3671 } 3272 }
3672 } 3273 }
3673 3274
3674 // Tests that the library is configured with the codecs we want. 3275 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3675 TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { 3276 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) {
3676 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3677 // module.
3678
3679 // Check codecs by name.
3680 #ifdef WEBRTC_CODEC_OPUS
3681 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3682 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
3683 #endif
3684 #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
3685 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3686 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
3687 #endif
3688 #if (defined(WEBRTC_CODEC_ISAC))
3689 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3690 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
3691 #endif
3692 #ifdef WEBRTC_CODEC_ILBC
3693 // Check that name matching is case-insensitive.
3694 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3695 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
3696 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3697 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
3698 #endif
3699 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3700 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
3701 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3702 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
3703 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3704 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
3705 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3706 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3707 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3708 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3709 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3710 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
3711 // Check codecs with an id by id.
3712 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3713 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
3714 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3715 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
3716 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3717 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
3718 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3719 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
3720 // Check sample/bitrate matching.
3721 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3722 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
3723 // Check that bad codecs fail.
3724 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3725 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
3726 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3727 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
3728 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3729 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
3730 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3731 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
3732 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3733 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
3734
3735 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3736 // TODO(ossu): Why are the payload types of codecs with non-static payload 3277 // TODO(ossu): Why are the payload types of codecs with non-static payload
3737 // type assignments checked here? It shouldn't really matter. 3278 // type assignments checked here? It shouldn't really matter.
3738 cricket::WebRtcVoiceEngine engine( 3279 cricket::WebRtcVoiceEngine engine(
3739 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); 3280 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
3740 for (const cricket::AudioCodec& codec : engine.send_codecs()) { 3281 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3741 if (codec.name == "CN" && codec.clockrate == 16000) { 3282 auto is_codec = [&codec](const char* name, int clockrate = 0) {
3283 return STR_CASE_CMP(codec.name.c_str(), name) == 0 &&
3284 (clockrate == 0 || codec.clockrate == clockrate);
3285 };
3286 if (is_codec("CN", 16000)) {
3742 EXPECT_EQ(105, codec.id); 3287 EXPECT_EQ(105, codec.id);
3743 } else if (codec.name == "CN" && codec.clockrate == 32000) { 3288 } else if (is_codec("CN", 32000)) {
3744 EXPECT_EQ(106, codec.id); 3289 EXPECT_EQ(106, codec.id);
3745 } else if (codec.name == "ISAC" && codec.clockrate == 16000) { 3290 } else if (is_codec("ISAC", 16000)) {
3746 EXPECT_EQ(103, codec.id); 3291 EXPECT_EQ(103, codec.id);
3747 } else if (codec.name == "ISAC" && codec.clockrate == 32000) { 3292 } else if (is_codec("ISAC", 32000)) {
3748 EXPECT_EQ(104, codec.id); 3293 EXPECT_EQ(104, codec.id);
3749 } else if (codec.name == "G722" && codec.clockrate == 8000) { 3294 } else if (is_codec("G722", 8000)) {
3750 EXPECT_EQ(9, codec.id); 3295 EXPECT_EQ(9, codec.id);
3751 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) { 3296 } else if (is_codec("telephone-event", 8000)) {
3752 EXPECT_EQ(126, codec.id); 3297 EXPECT_EQ(126, codec.id);
3753 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned. 3298 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3754 // Remove these checks once both send and receive side assigns payload types 3299 // Remove these checks once both send and receive side assigns payload types
3755 // dynamically. 3300 // dynamically.
3756 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) { 3301 } else if (is_codec("telephone-event", 16000)) {
3757 EXPECT_EQ(113, codec.id); 3302 EXPECT_EQ(113, codec.id);
3758 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) { 3303 } else if (is_codec("telephone-event", 32000)) {
3759 EXPECT_EQ(112, codec.id); 3304 EXPECT_EQ(112, codec.id);
3760 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) { 3305 } else if (is_codec("telephone-event", 48000)) {
3761 EXPECT_EQ(110, codec.id); 3306 EXPECT_EQ(110, codec.id);
3762 } else if (codec.name == "opus") { 3307 } else if (is_codec("opus")) {
3763 EXPECT_EQ(111, codec.id); 3308 EXPECT_EQ(111, codec.id);
3764 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end()); 3309 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3765 EXPECT_EQ("10", codec.params.find("minptime")->second); 3310 EXPECT_EQ("10", codec.params.find("minptime")->second);
3766 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end()); 3311 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3767 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); 3312 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
3768 } 3313 }
3769 } 3314 }
3770 } 3315 }
3771 3316
3772 // Tests that VoE supports at least 32 channels 3317 // Tests that VoE supports at least 32 channels
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
3881 // Without this cast, the comparison turned unsigned and, thus, failed for -1. 3426 // Without this cast, the comparison turned unsigned and, thus, failed for -1.
3882 const int num_specs = static_cast<int>(specs.size()); 3427 const int num_specs = static_cast<int>(specs.size());
3883 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); 3428 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs);
3884 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); 3429 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs);
3885 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); 3430 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1);
3886 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); 3431 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs);
3887 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); 3432 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs);
3888 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); 3433 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs);
3889 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); 3434 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs);
3890 } 3435 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698