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

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

Issue 2705093002: Injectable audio encoders: WebRtcVoiceEngine and company (Closed)
Patch Set: Moved duplicated configuration from constructor to ConfigureStream (previously Reconfigure) Created 3 years, 8 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 1163
1241 // Test that we apply codecs properly. 1164 // Test that we apply codecs properly.
1242 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) { 1165 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
1243 EXPECT_TRUE(SetupSendStream()); 1166 EXPECT_TRUE(SetupSendStream());
1244 cricket::AudioSendParameters parameters; 1167 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kIsacCodec); 1168 parameters.codecs.push_back(kIsacCodec);
1246 parameters.codecs.push_back(kPcmuCodec); 1169 parameters.codecs.push_back(kPcmuCodec);
1247 parameters.codecs.push_back(kCn8000Codec); 1170 parameters.codecs.push_back(kCn8000Codec);
1248 parameters.codecs[0].id = 96; 1171 parameters.codecs[0].id = 96;
1249 parameters.codecs[0].bitrate = 48000; 1172 parameters.codecs[0].bitrate = 48000;
1250 const int initial_num = call_.GetNumCreatedSendStreams();
1251 SetSendParameters(parameters); 1173 SetSendParameters(parameters);
1252 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams()); 1174 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1253 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1175 EXPECT_EQ(96, send_codec_spec.payload_type);
1254 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1176 // EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1255 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate); 1177 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
1256 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1178 EXPECT_NE(send_codec_spec.format.clockrate_hz, 8000);
1257 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1179 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
1258 EXPECT_EQ(-1, send_codec_spec.cng_payload_type); 1180 // EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
1259 EXPECT_FALSE(channel_->CanInsertDtmf()); 1181 EXPECT_FALSE(channel_->CanInsertDtmf());
1260 } 1182 }
1261 1183
1262 // Test that VoE Channel doesn't call SetSendCodec again if same codec is tried 1184 // Test that WebRtcVoiceEngine reconfigures, rather than recreates its
1263 // to apply. 1185 // AudioSendStream.
1264 TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) { 1186 TEST_F(WebRtcVoiceEngineTestFake, DontRecreateSendStream) {
1265 EXPECT_TRUE(SetupSendStream()); 1187 EXPECT_TRUE(SetupSendStream());
1266 cricket::AudioSendParameters parameters; 1188 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kIsacCodec); 1189 parameters.codecs.push_back(kIsacCodec);
1268 parameters.codecs.push_back(kPcmuCodec); 1190 parameters.codecs.push_back(kPcmuCodec);
1269 parameters.codecs.push_back(kCn8000Codec); 1191 parameters.codecs.push_back(kCn8000Codec);
1270 parameters.codecs[0].id = 96; 1192 parameters.codecs[0].id = 96;
1271 parameters.codecs[0].bitrate = 48000; 1193 parameters.codecs[0].bitrate = 48000;
1272 const int initial_num = call_.GetNumCreatedSendStreams(); 1194 const int initial_num = call_.GetNumCreatedSendStreams();
1273 SetSendParameters(parameters); 1195 SetSendParameters(parameters);
1274 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams()); 1196 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1275 // Calling SetSendCodec again with same codec which is already set. 1197 // Calling SetSendCodec again with same codec which is already set.
1276 // In this case media channel shouldn't send codec to VoE. 1198 // In this case media channel shouldn't send codec to VoE.
1277 SetSendParameters(parameters); 1199 SetSendParameters(parameters);
1278 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams()); 1200 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1279 } 1201 }
1280 1202
1281 // Verify that G722 is set with 16000 samples per second to WebRTC. 1203 // TODO(ossu): Revisit if these tests need to be here, now that these kinds of
1282 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) { 1204 // tests should be available in AudioEncoderOpusTest.
1283 EXPECT_TRUE(SetupSendStream());
1284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kG722CodecSdp);
1286 SetSendParameters(parameters);
1287 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst;
1288 EXPECT_STREQ("G722", gcodec.plname);
1289 EXPECT_EQ(1, gcodec.channels);
1290 EXPECT_EQ(16000, gcodec.plfreq);
1291 }
1292 1205
1293 // Test that if clockrate is not 48000 for opus, we fail. 1206 // Test that if clockrate is not 48000 for opus, we fail.
1294 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) { 1207 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
1295 EXPECT_TRUE(SetupSendStream()); 1208 EXPECT_TRUE(SetupSendStream());
1296 cricket::AudioSendParameters parameters; 1209 cricket::AudioSendParameters parameters;
1297 parameters.codecs.push_back(kOpusCodec); 1210 parameters.codecs.push_back(kOpusCodec);
1298 parameters.codecs[0].bitrate = 0; 1211 parameters.codecs[0].bitrate = 0;
1299 parameters.codecs[0].clockrate = 50000; 1212 parameters.codecs[0].clockrate = 50000;
1300 EXPECT_FALSE(channel_->SetSendParameters(parameters)); 1213 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1301 } 1214 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) { 1259 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
1347 EXPECT_TRUE(SetupSendStream()); 1260 EXPECT_TRUE(SetupSendStream());
1348 cricket::AudioSendParameters parameters; 1261 cricket::AudioSendParameters parameters;
1349 parameters.codecs.push_back(kOpusCodec); 1262 parameters.codecs.push_back(kOpusCodec);
1350 parameters.codecs[0].bitrate = 0; 1263 parameters.codecs[0].bitrate = 0;
1351 parameters.codecs[0].channels = 1; 1264 parameters.codecs[0].channels = 1;
1352 parameters.codecs[0].params["stereo"] = "1"; 1265 parameters.codecs[0].params["stereo"] = "1";
1353 EXPECT_FALSE(channel_->SetSendParameters(parameters)); 1266 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1354 } 1267 }
1355 1268
1356 // Test that with bitrate=0 and no stereo, 1269 // Test that with bitrate=0 and no stereo, bitrate is 32000.
1357 // channels and bitrate are 1 and 32000.
1358 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) { 1270 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
1359 EXPECT_TRUE(SetupSendStream()); 1271 EXPECT_TRUE(SetupSendStream());
1360 cricket::AudioSendParameters parameters; 1272 cricket::AudioSendParameters parameters;
1361 parameters.codecs.push_back(kOpusCodec); 1273 parameters.codecs.push_back(kOpusCodec);
1362 parameters.codecs[0].bitrate = 0; 1274 parameters.codecs[0].bitrate = 0;
1363 SetSendParameters(parameters); 1275 SetSendParameters(parameters);
1364 CheckSendCodec(kSsrcX, "opus", 1, 32000); 1276 CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1365 } 1277 }
1366 1278
1367 // Test that with bitrate=0 and stereo=0, 1279 // Test that with bitrate=0 and stereo=0, bitrate is 32000.
1368 // channels and bitrate are 1 and 32000.
1369 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) { 1280 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
1370 EXPECT_TRUE(SetupSendStream()); 1281 EXPECT_TRUE(SetupSendStream());
1371 cricket::AudioSendParameters parameters; 1282 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kOpusCodec); 1283 parameters.codecs.push_back(kOpusCodec);
1373 parameters.codecs[0].bitrate = 0; 1284 parameters.codecs[0].bitrate = 0;
1374 parameters.codecs[0].params["stereo"] = "0"; 1285 parameters.codecs[0].params["stereo"] = "0";
1375 SetSendParameters(parameters); 1286 SetSendParameters(parameters);
1376 CheckSendCodec(kSsrcX, "opus", 1, 32000); 1287 CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1377 } 1288 }
1378 1289
1379 // Test that with bitrate=invalid and stereo=0, 1290 // Test that with bitrate=invalid and stereo=0, bitrate is 32000.
1380 // channels and bitrate are 1 and 32000.
1381 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) { 1291 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
1382 EXPECT_TRUE(SetupSendStream()); 1292 EXPECT_TRUE(SetupSendStream());
1383 cricket::AudioSendParameters parameters; 1293 cricket::AudioSendParameters parameters;
1384 parameters.codecs.push_back(kOpusCodec); 1294 parameters.codecs.push_back(kOpusCodec);
1385 parameters.codecs[0].params["stereo"] = "0"; 1295 parameters.codecs[0].params["stereo"] = "0";
1386 // bitrate that's out of the range between 6000 and 510000 will be clamped. 1296 // bitrate that's out of the range between 6000 and 510000 will be clamped.
1387 parameters.codecs[0].bitrate = 5999; 1297 parameters.codecs[0].bitrate = 5999;
1388 SetSendParameters(parameters); 1298 SetSendParameters(parameters);
1389 CheckSendCodec(kSsrcX, "opus", 1, 6000); 1299 CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1390 1300
1391 parameters.codecs[0].bitrate = 510001; 1301 parameters.codecs[0].bitrate = 510001;
1392 SetSendParameters(parameters); 1302 SetSendParameters(parameters);
1393 CheckSendCodec(kSsrcX, "opus", 1, 510000); 1303 CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1394 } 1304 }
1395 1305
1396 // Test that with bitrate=0 and stereo=1, 1306 // Test that with bitrate=0 and stereo=1, bitrate is 64000.
1397 // channels and bitrate are 2 and 64000.
1398 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) { 1307 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
1399 EXPECT_TRUE(SetupSendStream()); 1308 EXPECT_TRUE(SetupSendStream());
1400 cricket::AudioSendParameters parameters; 1309 cricket::AudioSendParameters parameters;
1401 parameters.codecs.push_back(kOpusCodec); 1310 parameters.codecs.push_back(kOpusCodec);
1402 parameters.codecs[0].bitrate = 0; 1311 parameters.codecs[0].bitrate = 0;
1403 parameters.codecs[0].params["stereo"] = "1"; 1312 parameters.codecs[0].params["stereo"] = "1";
1404 SetSendParameters(parameters); 1313 SetSendParameters(parameters);
1405 CheckSendCodec(kSsrcX, "opus", 2, 64000); 1314 CheckSendCodecBitrate(kSsrcX, "opus", 64000);
1406 } 1315 }
1407 1316
1408 // Test that with bitrate=invalid and stereo=1, 1317 // Test that with bitrate=invalid and stereo=1, bitrate is 64000.
1409 // channels and bitrate are 2 and 64000.
1410 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) { 1318 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
1411 EXPECT_TRUE(SetupSendStream()); 1319 EXPECT_TRUE(SetupSendStream());
1412 cricket::AudioSendParameters parameters; 1320 cricket::AudioSendParameters parameters;
1413 parameters.codecs.push_back(kOpusCodec); 1321 parameters.codecs.push_back(kOpusCodec);
1414 parameters.codecs[0].params["stereo"] = "1"; 1322 parameters.codecs[0].params["stereo"] = "1";
1415 // bitrate that's out of the range between 6000 and 510000 will be clamped. 1323 // bitrate that's out of the range between 6000 and 510000 will be clamped.
1416 parameters.codecs[0].bitrate = 5999; 1324 parameters.codecs[0].bitrate = 5999;
1417 SetSendParameters(parameters); 1325 SetSendParameters(parameters);
1418 CheckSendCodec(kSsrcX, "opus", 2, 6000); 1326 CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1419 1327
1420 parameters.codecs[0].bitrate = 510001; 1328 parameters.codecs[0].bitrate = 510001;
1421 SetSendParameters(parameters); 1329 SetSendParameters(parameters);
1422 CheckSendCodec(kSsrcX, "opus", 2, 510000); 1330 CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1423 } 1331 }
1424 1332
1425 // Test that with bitrate=N and stereo unset, 1333 // Test that with bitrate=N and stereo unset, bitrate is N.
1426 // channels and bitrate are 1 and N.
1427 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) { 1334 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
1428 EXPECT_TRUE(SetupSendStream()); 1335 EXPECT_TRUE(SetupSendStream());
1429 cricket::AudioSendParameters parameters; 1336 cricket::AudioSendParameters parameters;
1430 parameters.codecs.push_back(kOpusCodec); 1337 parameters.codecs.push_back(kOpusCodec);
1431 parameters.codecs[0].bitrate = 96000; 1338 parameters.codecs[0].bitrate = 96000;
1432 SetSendParameters(parameters); 1339 SetSendParameters(parameters);
1433 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1340 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1434 EXPECT_EQ(111, gcodec.pltype); 1341 EXPECT_EQ(111, spec.payload_type);
1435 EXPECT_EQ(96000, gcodec.rate); 1342 EXPECT_EQ(96000, spec.target_bitrate_bps);
1436 EXPECT_STREQ("opus", gcodec.plname); 1343 EXPECT_EQ("opus", spec.format.name);
1437 EXPECT_EQ(1, gcodec.channels); 1344 EXPECT_EQ(2, spec.format.num_channels);
1438 EXPECT_EQ(48000, gcodec.plfreq); 1345 EXPECT_EQ(48000, spec.format.clockrate_hz);
1439 } 1346 }
1440 1347
1441 // Test that with bitrate=N and stereo=0, 1348 // Test that with bitrate=N and stereo=0, bitrate is N.
1442 // channels and bitrate are 1 and N.
1443 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) { 1349 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
1444 EXPECT_TRUE(SetupSendStream()); 1350 EXPECT_TRUE(SetupSendStream());
1445 cricket::AudioSendParameters parameters; 1351 cricket::AudioSendParameters parameters;
1446 parameters.codecs.push_back(kOpusCodec); 1352 parameters.codecs.push_back(kOpusCodec);
1447 parameters.codecs[0].bitrate = 30000; 1353 parameters.codecs[0].bitrate = 30000;
1448 parameters.codecs[0].params["stereo"] = "0"; 1354 parameters.codecs[0].params["stereo"] = "0";
1449 SetSendParameters(parameters); 1355 SetSendParameters(parameters);
1450 CheckSendCodec(kSsrcX, "opus", 1, 30000); 1356 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1451 } 1357 }
1452 1358
1453 // Test that with bitrate=N and without any parameters, 1359 // Test that with bitrate=N and without any parameters, bitrate is N.
1454 // channels and bitrate are 1 and N.
1455 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) { 1360 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
1456 EXPECT_TRUE(SetupSendStream()); 1361 EXPECT_TRUE(SetupSendStream());
1457 cricket::AudioSendParameters parameters; 1362 cricket::AudioSendParameters parameters;
1458 parameters.codecs.push_back(kOpusCodec); 1363 parameters.codecs.push_back(kOpusCodec);
1459 parameters.codecs[0].bitrate = 30000; 1364 parameters.codecs[0].bitrate = 30000;
1460 SetSendParameters(parameters); 1365 SetSendParameters(parameters);
1461 CheckSendCodec(kSsrcX, "opus", 1, 30000); 1366 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1462 } 1367 }
1463 1368
1464 // Test that with bitrate=N and stereo=1, 1369 // Test that with bitrate=N and stereo=1, bitrate is N.
1465 // channels and bitrate are 2 and N.
1466 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) { 1370 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
1467 EXPECT_TRUE(SetupSendStream()); 1371 EXPECT_TRUE(SetupSendStream());
1468 cricket::AudioSendParameters parameters; 1372 cricket::AudioSendParameters parameters;
1469 parameters.codecs.push_back(kOpusCodec); 1373 parameters.codecs.push_back(kOpusCodec);
1470 parameters.codecs[0].bitrate = 30000; 1374 parameters.codecs[0].bitrate = 30000;
1471 parameters.codecs[0].params["stereo"] = "1"; 1375 parameters.codecs[0].params["stereo"] = "1";
1472 SetSendParameters(parameters); 1376 SetSendParameters(parameters);
1473 CheckSendCodec(kSsrcX, "opus", 2, 30000); 1377 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1474 }
1475
1476 // Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1477 // Also test that the "maxaveragebitrate" can't be set to values outside the
1478 // range of 6000 and 510000
1479 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
1480 EXPECT_TRUE(SetupSendStream());
1481 cricket::AudioSendParameters parameters;
1482 parameters.codecs.push_back(kOpusCodec);
1483 parameters.codecs[0].bitrate = 30000;
1484 // Ignore if less than 6000.
1485 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1486 SetSendParameters(parameters);
1487 EXPECT_EQ(6000, GetCodecBitrate(kSsrcX));
1488
1489 // Ignore if larger than 510000.
1490 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1491 SetSendParameters(parameters);
1492 EXPECT_EQ(510000, GetCodecBitrate(kSsrcX));
1493
1494 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1495 SetSendParameters(parameters);
1496 EXPECT_EQ(200000, GetCodecBitrate(kSsrcX));
1497 } 1378 }
1498 1379
1499 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) { 1380 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1500 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200", 1381 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1501 200000); 1382 200000);
1502 } 1383 }
1503 1384
1504 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) { 1385 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1505 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000); 1386 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1506 } 1387 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1622 cricket::kParamValueEmpty)); 1503 cricket::kParamValueEmpty));
1623 SetSendParameters(parameters); 1504 SetSendParameters(parameters);
1624 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms); 1505 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
1625 1506
1626 EXPECT_TRUE(AddRecvStream(kSsrcY)); 1507 EXPECT_TRUE(AddRecvStream(kSsrcY));
1627 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms); 1508 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1628 EXPECT_TRUE(AddRecvStream(kSsrcZ)); 1509 EXPECT_TRUE(AddRecvStream(kSsrcZ));
1629 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms); 1510 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms);
1630 } 1511 }
1631 1512
1632 // Test that without useinbandfec, Opus FEC is off.
1633 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
1634 EXPECT_TRUE(SetupSendStream());
1635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kOpusCodec);
1637 SetSendParameters(parameters);
1638 EXPECT_FALSE(GetCodecFec(kSsrcX));
1639 }
1640
1641 // Test that with useinbandfec=0, Opus FEC is off.
1642 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
1643 EXPECT_TRUE(SetupSendStream());
1644 cricket::AudioSendParameters parameters;
1645 parameters.codecs.push_back(kOpusCodec);
1646 parameters.codecs[0].bitrate = 0;
1647 parameters.codecs[0].params["useinbandfec"] = "0";
1648 SetSendParameters(parameters);
1649 CheckSendCodec(kSsrcX, "opus", 1, 32000);
1650 }
1651
1652 // Test that with useinbandfec=1, Opus FEC is on.
1653 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
1654 EXPECT_TRUE(SetupSendStream());
1655 cricket::AudioSendParameters parameters;
1656 parameters.codecs.push_back(kOpusCodec);
1657 parameters.codecs[0].bitrate = 0;
1658 parameters.codecs[0].params["useinbandfec"] = "1";
1659 SetSendParameters(parameters);
1660 EXPECT_TRUE(GetCodecFec(kSsrcX));
1661 CheckSendCodec(kSsrcX, "opus", 1, 32000);
1662 }
1663
1664 // Test that with useinbandfec=1, stereo=1, Opus FEC is on.
1665 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
1666 EXPECT_TRUE(SetupSendStream());
1667 cricket::AudioSendParameters parameters;
1668 parameters.codecs.push_back(kOpusCodec);
1669 parameters.codecs[0].bitrate = 0;
1670 parameters.codecs[0].params["stereo"] = "1";
1671 parameters.codecs[0].params["useinbandfec"] = "1";
1672 SetSendParameters(parameters);
1673 EXPECT_TRUE(GetCodecFec(kSsrcX));
1674 CheckSendCodec(kSsrcX, "opus", 2, 64000);
1675 }
1676
1677 // Test that with non-Opus, codec FEC is off.
1678 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
1679 EXPECT_TRUE(SetupSendStream());
1680 cricket::AudioSendParameters parameters;
1681 parameters.codecs.push_back(kIsacCodec);
1682 SetSendParameters(parameters);
1683 EXPECT_FALSE(GetCodecFec(kSsrcX));
1684 }
1685
1686 // Test the with non-Opus, even if useinbandfec=1, FEC is off.
1687 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1688 EXPECT_TRUE(SetupSendStream());
1689 cricket::AudioSendParameters parameters;
1690 parameters.codecs.push_back(kIsacCodec);
1691 parameters.codecs[0].params["useinbandfec"] = "1";
1692 SetSendParameters(parameters);
1693 EXPECT_FALSE(GetCodecFec(kSsrcX));
1694 }
1695
1696 // Test that Opus FEC status can be changed.
1697 TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1698 EXPECT_TRUE(SetupSendStream());
1699 cricket::AudioSendParameters parameters;
1700 parameters.codecs.push_back(kOpusCodec);
1701 SetSendParameters(parameters);
1702 EXPECT_FALSE(GetCodecFec(kSsrcX));
1703
1704 parameters.codecs[0].params["useinbandfec"] = "1";
1705 SetSendParameters(parameters);
1706 EXPECT_TRUE(GetCodecFec(kSsrcX));
1707 }
1708
1709 TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) { 1513 TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1710 EXPECT_TRUE(SetupChannel()); 1514 EXPECT_TRUE(SetupChannel());
1711 cricket::AudioSendParameters send_parameters; 1515 cricket::AudioSendParameters send_parameters;
1712 send_parameters.codecs.push_back(kOpusCodec); 1516 send_parameters.codecs.push_back(kOpusCodec);
1713 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty()); 1517 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1714 SetSendParameters(send_parameters); 1518 SetSendParameters(send_parameters);
1715 1519
1716 cricket::AudioRecvParameters recv_parameters; 1520 cricket::AudioRecvParameters recv_parameters;
1717 recv_parameters.codecs.push_back(kIsacCodec); 1521 recv_parameters.codecs.push_back(kIsacCodec);
1718 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters)); 1522 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1719 EXPECT_TRUE(AddRecvStream(kSsrcX)); 1523 EXPECT_TRUE(AddRecvStream(kSsrcX));
1720 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr); 1524 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1721 EXPECT_FALSE( 1525 EXPECT_FALSE(
1722 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc); 1526 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc);
1723 1527
1724 send_parameters.codecs = engine_->send_codecs(); 1528 send_parameters.codecs = engine_->send_codecs();
1725 SetSendParameters(send_parameters); 1529 SetSendParameters(send_parameters);
1726 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr); 1530 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1727 EXPECT_TRUE( 1531 EXPECT_TRUE(
1728 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc); 1532 call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc);
1729 } 1533 }
1730 1534
1731 // Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1732 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1733 EXPECT_TRUE(SetupSendStream());
1734 cricket::AudioSendParameters parameters;
1735 parameters.codecs.push_back(kOpusCodec);
1736 parameters.codecs[0].bitrate = 0;
1737 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1738 SetSendParameters(parameters);
1739 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrcX));
1740 EXPECT_EQ(12000, GetCodecBitrate(kSsrcX));
1741
1742 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1743 SetSendParameters(parameters);
1744 EXPECT_EQ(24000, GetCodecBitrate(kSsrcX));
1745 }
1746
1747 // Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1748 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1749 EXPECT_TRUE(SetupSendStream());
1750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kOpusCodec);
1752 parameters.codecs[0].bitrate = 0;
1753 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1754 SetSendParameters(parameters);
1755 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrcX));
1756 EXPECT_EQ(20000, GetCodecBitrate(kSsrcX));
1757
1758 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1759 SetSendParameters(parameters);
1760 EXPECT_EQ(40000, GetCodecBitrate(kSsrcX));
1761 }
1762
1763 // Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1764 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1765 EXPECT_TRUE(SetupSendStream());
1766 cricket::AudioSendParameters parameters;
1767 parameters.codecs.push_back(kOpusCodec);
1768 parameters.codecs[0].bitrate = 0;
1769 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1770 SetSendParameters(parameters);
1771 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrcX));
1772 EXPECT_EQ(20000, GetCodecBitrate(kSsrcX));
1773
1774 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1775 SetSendParameters(parameters);
1776 EXPECT_EQ(40000, GetCodecBitrate(kSsrcX));
1777 }
1778
1779 // Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1780 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1781 EXPECT_TRUE(SetupSendStream());
1782 cricket::AudioSendParameters parameters;
1783 parameters.codecs.push_back(kOpusCodec);
1784 parameters.codecs[0].bitrate = 0;
1785 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1786 SetSendParameters(parameters);
1787 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrcX));
1788 EXPECT_EQ(32000, GetCodecBitrate(kSsrcX));
1789
1790 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1791 SetSendParameters(parameters);
1792 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1793 }
1794
1795 // Test 24000 < maxplaybackrate triggers Opus full band mode.
1796 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1797 EXPECT_TRUE(SetupSendStream());
1798 cricket::AudioSendParameters parameters;
1799 parameters.codecs.push_back(kOpusCodec);
1800 parameters.codecs[0].bitrate = 0;
1801 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1802 SetSendParameters(parameters);
1803 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrcX));
1804 EXPECT_EQ(32000, GetCodecBitrate(kSsrcX));
1805
1806 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1807 SetSendParameters(parameters);
1808 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1809 }
1810
1811 // Test Opus that without maxplaybackrate, default playback rate is used.
1812 TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1813 EXPECT_TRUE(SetupSendStream());
1814 cricket::AudioSendParameters parameters;
1815 parameters.codecs.push_back(kOpusCodec);
1816 SetSendParameters(parameters);
1817 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrcX));
1818 }
1819
1820 // Test the with non-Opus, maxplaybackrate has no effect.
1821 TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
1822 EXPECT_TRUE(SetupSendStream());
1823 cricket::AudioSendParameters parameters;
1824 parameters.codecs.push_back(kIsacCodec);
1825 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1826 SetSendParameters(parameters);
1827 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrcX));
1828 }
1829
1830 // Test maxplaybackrate can be set on two streams.
1831 TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1832 EXPECT_TRUE(SetupSendStream());
1833 cricket::AudioSendParameters parameters;
1834 parameters.codecs.push_back(kOpusCodec);
1835 SetSendParameters(parameters);
1836 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrcX));
1837
1838 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1839 SetSendParameters(parameters);
1840 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrcX));
1841
1842 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcY));
1843 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrcY));
1844 }
1845
1846 // Test that with usedtx=0, Opus DTX is off.
1847 TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
1848 EXPECT_TRUE(SetupSendStream());
1849 cricket::AudioSendParameters parameters;
1850 parameters.codecs.push_back(kOpusCodec);
1851 parameters.codecs[0].params["usedtx"] = "0";
1852 SetSendParameters(parameters);
1853 EXPECT_FALSE(GetOpusDtx(kSsrcX));
1854 }
1855
1856 // Test that with usedtx=1, Opus DTX is on.
1857 TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
1858 EXPECT_TRUE(SetupSendStream());
1859 cricket::AudioSendParameters parameters;
1860 parameters.codecs.push_back(kOpusCodec);
1861 parameters.codecs[0].params["usedtx"] = "1";
1862 SetSendParameters(parameters);
1863 EXPECT_TRUE(GetOpusDtx(kSsrcX));
1864 }
1865
1866 // Test that usedtx=1 works with stereo Opus.
1867 TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
1868 EXPECT_TRUE(SetupSendStream());
1869 cricket::AudioSendParameters parameters;
1870 parameters.codecs.push_back(kOpusCodec);
1871 parameters.codecs[0].params["usedtx"] = "1";
1872 parameters.codecs[0].params["stereo"] = "1";
1873 SetSendParameters(parameters);
1874 EXPECT_TRUE(GetOpusDtx(kSsrcX));
1875 }
1876
1877 // Test that usedtx=1 does not work with non Opus.
1878 TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
1879 EXPECT_TRUE(SetupSendStream());
1880 cricket::AudioSendParameters parameters;
1881 parameters.codecs.push_back(kIsacCodec);
1882 parameters.codecs[0].params["usedtx"] = "1";
1883 SetSendParameters(parameters);
1884 EXPECT_FALSE(GetOpusDtx(kSsrcX));
1885 }
1886
1887 // Test that we can switch back and forth between Opus and ISAC with CN. 1535 // Test that we can switch back and forth between Opus and ISAC with CN.
1888 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) { 1536 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
1889 EXPECT_TRUE(SetupSendStream()); 1537 EXPECT_TRUE(SetupSendStream());
1890 1538
1891 cricket::AudioSendParameters opus_parameters; 1539 cricket::AudioSendParameters opus_parameters;
1892 opus_parameters.codecs.push_back(kOpusCodec); 1540 opus_parameters.codecs.push_back(kOpusCodec);
1893 SetSendParameters(opus_parameters); 1541 SetSendParameters(opus_parameters);
1894 { 1542 {
1895 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1543 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1896 EXPECT_EQ(111, gcodec.pltype); 1544 EXPECT_EQ(111, spec.payload_type);
1897 EXPECT_STREQ("opus", gcodec.plname); 1545 EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1898 } 1546 }
1899 1547
1900 cricket::AudioSendParameters isac_parameters; 1548 cricket::AudioSendParameters isac_parameters;
1901 isac_parameters.codecs.push_back(kIsacCodec); 1549 isac_parameters.codecs.push_back(kIsacCodec);
1902 isac_parameters.codecs.push_back(kCn16000Codec); 1550 isac_parameters.codecs.push_back(kCn16000Codec);
1903 isac_parameters.codecs.push_back(kOpusCodec); 1551 isac_parameters.codecs.push_back(kOpusCodec);
1904 SetSendParameters(isac_parameters); 1552 SetSendParameters(isac_parameters);
1905 { 1553 {
1906 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1554 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1907 EXPECT_EQ(103, gcodec.pltype); 1555 EXPECT_EQ(103, spec.payload_type);
1908 EXPECT_STREQ("ISAC", gcodec.plname); 1556 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1909 } 1557 }
1910 1558
1911 SetSendParameters(opus_parameters); 1559 SetSendParameters(opus_parameters);
1912 { 1560 {
1913 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1561 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1914 EXPECT_EQ(111, gcodec.pltype); 1562 EXPECT_EQ(111, spec.payload_type);
1915 EXPECT_STREQ("opus", gcodec.plname); 1563 EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1916 } 1564 }
1917 } 1565 }
1918 1566
1919 // Test that we handle various ways of specifying bitrate. 1567 // Test that we handle various ways of specifying bitrate.
1920 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) { 1568 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1921 EXPECT_TRUE(SetupSendStream()); 1569 EXPECT_TRUE(SetupSendStream());
1922 cricket::AudioSendParameters parameters; 1570 cricket::AudioSendParameters parameters;
1923 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000 1571 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1924 SetSendParameters(parameters); 1572 SetSendParameters(parameters);
1925 { 1573 {
1926 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1574 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1927 EXPECT_EQ(103, gcodec.pltype); 1575 EXPECT_EQ(103, spec.payload_type);
1928 EXPECT_STREQ("ISAC", gcodec.plname); 1576 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1929 EXPECT_EQ(32000, gcodec.rate); 1577 EXPECT_EQ(32000, spec.target_bitrate_bps);
1930 } 1578 }
1931 1579
1932 parameters.codecs[0].bitrate = 0; // bitrate == default 1580 parameters.codecs[0].bitrate = 0; // bitrate == default
1933 SetSendParameters(parameters); 1581 SetSendParameters(parameters);
1934 { 1582 {
1935 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1583 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1936 EXPECT_EQ(103, gcodec.pltype); 1584 EXPECT_EQ(103, spec.payload_type);
1937 EXPECT_STREQ("ISAC", gcodec.plname); 1585 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1938 EXPECT_EQ(32000, gcodec.rate); 1586 EXPECT_EQ(32000, spec.target_bitrate_bps);
1939 } 1587 }
1940 parameters.codecs[0].bitrate = 28000; // bitrate == 28000 1588 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1941 SetSendParameters(parameters); 1589 SetSendParameters(parameters);
1942 { 1590 {
1943 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1591 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1944 EXPECT_EQ(103, gcodec.pltype); 1592 EXPECT_EQ(103, spec.payload_type);
1945 EXPECT_STREQ("ISAC", gcodec.plname); 1593 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
1946 EXPECT_EQ(28000, gcodec.rate); 1594 EXPECT_EQ(28000, spec.target_bitrate_bps);
1947 } 1595 }
1948 1596
1949 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000 1597 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1950 SetSendParameters(parameters); 1598 SetSendParameters(parameters);
1951 { 1599 {
1952 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1600 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1953 EXPECT_EQ(0, gcodec.pltype); 1601 EXPECT_EQ(0, spec.payload_type);
1954 EXPECT_STREQ("PCMU", gcodec.plname); 1602 EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
1955 EXPECT_EQ(64000, gcodec.rate); 1603 EXPECT_EQ(64000, spec.target_bitrate_bps);
1956 } 1604 }
1957 1605
1958 parameters.codecs[0].bitrate = 0; // bitrate == default 1606 parameters.codecs[0].bitrate = 0; // bitrate == default
1959 SetSendParameters(parameters); 1607 SetSendParameters(parameters);
1960 { 1608 {
1961 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1609 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1962 EXPECT_EQ(0, gcodec.pltype); 1610 EXPECT_EQ(0, spec.payload_type);
1963 EXPECT_STREQ("PCMU", gcodec.plname); 1611 EXPECT_STREQ("PCMU", spec.format.name.c_str());
1964 EXPECT_EQ(64000, gcodec.rate); 1612 EXPECT_EQ(64000, spec.target_bitrate_bps);
1965 } 1613 }
1966 1614
1967 parameters.codecs[0] = kOpusCodec; 1615 parameters.codecs[0] = kOpusCodec;
1968 parameters.codecs[0].bitrate = 0; // bitrate == default 1616 parameters.codecs[0].bitrate = 0; // bitrate == default
1969 SetSendParameters(parameters); 1617 SetSendParameters(parameters);
1970 { 1618 {
1971 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1619 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1972 EXPECT_EQ(111, gcodec.pltype); 1620 EXPECT_EQ(111, spec.payload_type);
1973 EXPECT_STREQ("opus", gcodec.plname); 1621 EXPECT_STREQ("opus", spec.format.name.c_str());
1974 EXPECT_EQ(32000, gcodec.rate); 1622 EXPECT_EQ(32000, spec.target_bitrate_bps);
1975 } 1623 }
1976 } 1624 }
1977 1625
1978 // Test that we could set packet size specified in kCodecParamPTime.
1979 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
1980 EXPECT_TRUE(SetupSendStream());
1981 cricket::AudioSendParameters parameters;
1982 parameters.codecs.push_back(kOpusCodec);
1983 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1984 SetSendParameters(parameters);
1985 EXPECT_EQ(1920, GetCodecPacSize(kSsrcX)); // Opus gets 40ms.
1986
1987 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1988 SetSendParameters(parameters);
1989 EXPECT_EQ(480, GetCodecPacSize(kSsrcX)); // Opus gets 10ms.
1990
1991 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1992 SetSendParameters(parameters);
1993 EXPECT_EQ(2880, GetCodecPacSize(kSsrcX)); // Opus gets 60ms.
1994
1995 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1996 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1997 SetSendParameters(parameters);
1998 EXPECT_EQ(480, GetCodecPacSize(
1999 kSsrcX)); // Isac gets 30ms as the next smallest value.
2000
2001 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
2002 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
2003 SetSendParameters(parameters);
2004 EXPECT_EQ(640, GetCodecPacSize(
2005 kSsrcX)); // G722 gets 40ms @16kHz as defined in VoE.
2006 }
2007
2008 // Test that we fail if no codecs are specified. 1626 // Test that we fail if no codecs are specified.
2009 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) { 1627 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
2010 EXPECT_TRUE(SetupSendStream()); 1628 EXPECT_TRUE(SetupSendStream());
2011 cricket::AudioSendParameters parameters; 1629 cricket::AudioSendParameters parameters;
2012 EXPECT_FALSE(channel_->SetSendParameters(parameters)); 1630 EXPECT_FALSE(channel_->SetSendParameters(parameters));
2013 } 1631 }
2014 1632
2015 // Test that we can set send codecs even with telephone-event codec as the first 1633 // Test that we can set send codecs even with telephone-event codec as the first
2016 // one on the list. 1634 // one on the list.
2017 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) { 1635 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
2018 EXPECT_TRUE(SetupSendStream()); 1636 EXPECT_TRUE(SetupSendStream());
2019 cricket::AudioSendParameters parameters; 1637 cricket::AudioSendParameters parameters;
2020 parameters.codecs.push_back(kTelephoneEventCodec1); 1638 parameters.codecs.push_back(kTelephoneEventCodec1);
2021 parameters.codecs.push_back(kIsacCodec); 1639 parameters.codecs.push_back(kIsacCodec);
2022 parameters.codecs.push_back(kPcmuCodec); 1640 parameters.codecs.push_back(kPcmuCodec);
2023 parameters.codecs[0].id = 98; // DTMF 1641 parameters.codecs[0].id = 98; // DTMF
2024 parameters.codecs[1].id = 96; 1642 parameters.codecs[1].id = 96;
2025 SetSendParameters(parameters); 1643 SetSendParameters(parameters);
2026 const auto& gcodec = GetSendStreamConfig(kSsrcX).send_codec_spec.codec_inst; 1644 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2027 EXPECT_EQ(96, gcodec.pltype); 1645 EXPECT_EQ(96, spec.payload_type);
2028 EXPECT_STREQ("ISAC", gcodec.plname); 1646 EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
2029 EXPECT_TRUE(channel_->CanInsertDtmf()); 1647 EXPECT_TRUE(channel_->CanInsertDtmf());
2030 } 1648 }
2031 1649
2032 // Test that payload type range is limited for telephone-event codec. 1650 // Test that payload type range is limited for telephone-event codec.
2033 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) { 1651 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
2034 EXPECT_TRUE(SetupSendStream()); 1652 EXPECT_TRUE(SetupSendStream());
2035 cricket::AudioSendParameters parameters; 1653 cricket::AudioSendParameters parameters;
2036 parameters.codecs.push_back(kTelephoneEventCodec2); 1654 parameters.codecs.push_back(kTelephoneEventCodec2);
2037 parameters.codecs.push_back(kIsacCodec); 1655 parameters.codecs.push_back(kIsacCodec);
2038 parameters.codecs[0].id = 0; // DTMF 1656 parameters.codecs[0].id = 0; // DTMF
(...skipping 15 matching lines...) Expand all
2054 // one on the list. 1672 // one on the list.
2055 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) { 1673 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
2056 EXPECT_TRUE(SetupSendStream()); 1674 EXPECT_TRUE(SetupSendStream());
2057 cricket::AudioSendParameters parameters; 1675 cricket::AudioSendParameters parameters;
2058 parameters.codecs.push_back(kCn16000Codec); 1676 parameters.codecs.push_back(kCn16000Codec);
2059 parameters.codecs.push_back(kIsacCodec); 1677 parameters.codecs.push_back(kIsacCodec);
2060 parameters.codecs.push_back(kPcmuCodec); 1678 parameters.codecs.push_back(kPcmuCodec);
2061 parameters.codecs[0].id = 98; // wideband CN 1679 parameters.codecs[0].id = 98; // wideband CN
2062 parameters.codecs[1].id = 96; 1680 parameters.codecs[1].id = 96;
2063 SetSendParameters(parameters); 1681 SetSendParameters(parameters);
2064 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1682 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2065 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1683 EXPECT_EQ(96, send_codec_spec.payload_type);
2066 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1684 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2067 EXPECT_EQ(98, send_codec_spec.cng_payload_type); 1685 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2068 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq); 1686 // EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2069 } 1687 }
2070 1688
2071 // Test that we set VAD and DTMF types correctly as caller. 1689 // Test that we set VAD and DTMF types correctly as caller.
2072 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) { 1690 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
2073 EXPECT_TRUE(SetupSendStream()); 1691 EXPECT_TRUE(SetupSendStream());
2074 cricket::AudioSendParameters parameters; 1692 cricket::AudioSendParameters parameters;
2075 parameters.codecs.push_back(kIsacCodec); 1693 parameters.codecs.push_back(kIsacCodec);
2076 parameters.codecs.push_back(kPcmuCodec); 1694 parameters.codecs.push_back(kPcmuCodec);
2077 // TODO(juberti): cn 32000 1695 // TODO(juberti): cn 32000
2078 parameters.codecs.push_back(kCn16000Codec); 1696 parameters.codecs.push_back(kCn16000Codec);
2079 parameters.codecs.push_back(kCn8000Codec); 1697 parameters.codecs.push_back(kCn8000Codec);
2080 parameters.codecs.push_back(kTelephoneEventCodec1); 1698 parameters.codecs.push_back(kTelephoneEventCodec1);
2081 parameters.codecs[0].id = 96; 1699 parameters.codecs[0].id = 96;
2082 parameters.codecs[2].id = 97; // wideband CN 1700 parameters.codecs[2].id = 97; // wideband CN
2083 parameters.codecs[4].id = 98; // DTMF 1701 parameters.codecs[4].id = 98; // DTMF
2084 SetSendParameters(parameters); 1702 SetSendParameters(parameters);
2085 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1703 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2086 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1704 EXPECT_EQ(96, send_codec_spec.payload_type);
2087 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1705 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2088 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1706 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2089 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2090 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1707 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2091 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2092 EXPECT_TRUE(channel_->CanInsertDtmf()); 1708 EXPECT_TRUE(channel_->CanInsertDtmf());
2093 } 1709 }
2094 1710
2095 // Test that we set VAD and DTMF types correctly as callee. 1711 // Test that we set VAD and DTMF types correctly as callee.
2096 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) { 1712 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
2097 EXPECT_TRUE(SetupChannel()); 1713 EXPECT_TRUE(SetupChannel());
2098 cricket::AudioSendParameters parameters; 1714 cricket::AudioSendParameters parameters;
2099 parameters.codecs.push_back(kIsacCodec); 1715 parameters.codecs.push_back(kIsacCodec);
2100 parameters.codecs.push_back(kPcmuCodec); 1716 parameters.codecs.push_back(kPcmuCodec);
2101 // TODO(juberti): cn 32000 1717 // TODO(juberti): cn 32000
2102 parameters.codecs.push_back(kCn16000Codec); 1718 parameters.codecs.push_back(kCn16000Codec);
2103 parameters.codecs.push_back(kCn8000Codec); 1719 parameters.codecs.push_back(kCn8000Codec);
2104 parameters.codecs.push_back(kTelephoneEventCodec2); 1720 parameters.codecs.push_back(kTelephoneEventCodec2);
2105 parameters.codecs[0].id = 96; 1721 parameters.codecs[0].id = 96;
2106 parameters.codecs[2].id = 97; // wideband CN 1722 parameters.codecs[2].id = 97; // wideband CN
2107 parameters.codecs[4].id = 98; // DTMF 1723 parameters.codecs[4].id = 98; // DTMF
2108 SetSendParameters(parameters); 1724 SetSendParameters(parameters);
2109 EXPECT_TRUE(channel_->AddSendStream( 1725 EXPECT_TRUE(channel_->AddSendStream(
2110 cricket::StreamParams::CreateLegacy(kSsrcX))); 1726 cricket::StreamParams::CreateLegacy(kSsrcX)));
2111 1727
2112 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1728 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2113 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1729 EXPECT_EQ(96, send_codec_spec.payload_type);
2114 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1730 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2115 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1731 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2116 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2117 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1732 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2118 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2119 EXPECT_TRUE(channel_->CanInsertDtmf()); 1733 EXPECT_TRUE(channel_->CanInsertDtmf());
2120 } 1734 }
2121 1735
2122 // Test that we only apply VAD if we have a CN codec that matches the 1736 // Test that we only apply VAD if we have a CN codec that matches the
2123 // send codec clockrate. 1737 // send codec clockrate.
2124 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) { 1738 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
2125 EXPECT_TRUE(SetupSendStream()); 1739 EXPECT_TRUE(SetupSendStream());
2126 cricket::AudioSendParameters parameters; 1740 cricket::AudioSendParameters parameters;
2127 // Set ISAC(16K) and CN(16K). VAD should be activated. 1741 // Set ISAC(16K) and CN(16K). VAD should be activated.
2128 parameters.codecs.push_back(kIsacCodec); 1742 parameters.codecs.push_back(kIsacCodec);
2129 parameters.codecs.push_back(kCn16000Codec); 1743 parameters.codecs.push_back(kCn16000Codec);
2130 parameters.codecs[1].id = 97; 1744 parameters.codecs[1].id = 97;
2131 SetSendParameters(parameters); 1745 SetSendParameters(parameters);
2132 { 1746 {
2133 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1747 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2134 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1748 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2135 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1749 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2136 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2137 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1750 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2138 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2139 } 1751 }
2140 // Set PCMU(8K) and CN(16K). VAD should not be activated. 1752 // Set PCMU(8K) and CN(16K). VAD should not be activated.
2141 parameters.codecs[0] = kPcmuCodec; 1753 parameters.codecs[0] = kPcmuCodec;
2142 SetSendParameters(parameters); 1754 SetSendParameters(parameters);
2143 { 1755 {
2144 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1756 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2145 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname); 1757 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2146 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1758 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
2147 } 1759 }
2148 // Set PCMU(8K) and CN(8K). VAD should be activated. 1760 // Set PCMU(8K) and CN(8K). VAD should be activated.
2149 parameters.codecs[1] = kCn8000Codec; 1761 parameters.codecs[1] = kCn8000Codec;
2150 SetSendParameters(parameters); 1762 SetSendParameters(parameters);
2151 { 1763 {
2152 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1764 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2153 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname); 1765 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2154 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1766 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2155 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2156 EXPECT_EQ(13, send_codec_spec.cng_payload_type); 1767 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2157 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2158 } 1768 }
2159 // Set ISAC(16K) and CN(8K). VAD should not be activated. 1769 // Set ISAC(16K) and CN(8K). VAD should not be activated.
2160 parameters.codecs[0] = kIsacCodec; 1770 parameters.codecs[0] = kIsacCodec;
2161 SetSendParameters(parameters); 1771 SetSendParameters(parameters);
2162 { 1772 {
2163 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1773 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2164 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1774 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2165 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1775 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
2166 } 1776 }
2167 } 1777 }
2168 1778
2169 // Test that we perform case-insensitive matching of codec names. 1779 // Test that we perform case-insensitive matching of codec names.
2170 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) { 1780 TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
2171 EXPECT_TRUE(SetupSendStream()); 1781 EXPECT_TRUE(SetupSendStream());
2172 cricket::AudioSendParameters parameters; 1782 cricket::AudioSendParameters parameters;
2173 parameters.codecs.push_back(kIsacCodec); 1783 parameters.codecs.push_back(kIsacCodec);
2174 parameters.codecs.push_back(kPcmuCodec); 1784 parameters.codecs.push_back(kPcmuCodec);
2175 parameters.codecs.push_back(kCn16000Codec); 1785 parameters.codecs.push_back(kCn16000Codec);
2176 parameters.codecs.push_back(kCn8000Codec); 1786 parameters.codecs.push_back(kCn8000Codec);
2177 parameters.codecs.push_back(kTelephoneEventCodec1); 1787 parameters.codecs.push_back(kTelephoneEventCodec1);
2178 parameters.codecs[0].name = "iSaC"; 1788 parameters.codecs[0].name = "iSaC";
2179 parameters.codecs[0].id = 96; 1789 parameters.codecs[0].id = 96;
2180 parameters.codecs[2].id = 97; // wideband CN 1790 parameters.codecs[2].id = 97; // wideband CN
2181 parameters.codecs[4].id = 98; // DTMF 1791 parameters.codecs[4].id = 98; // DTMF
2182 SetSendParameters(parameters); 1792 SetSendParameters(parameters);
2183 const auto& send_codec_spec = GetSendStreamConfig(kSsrcX).send_codec_spec; 1793 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2184 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype); 1794 EXPECT_EQ(96, send_codec_spec.payload_type);
2185 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1795 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2186 EXPECT_EQ(1, send_codec_spec.codec_inst.channels); 1796 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2187 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2188 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1797 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2189 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2190 EXPECT_TRUE(channel_->CanInsertDtmf()); 1798 EXPECT_TRUE(channel_->CanInsertDtmf());
2191 } 1799 }
2192 1800
2193 class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake { 1801 class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2194 public: 1802 public:
2195 WebRtcVoiceEngineWithSendSideBweTest() 1803 WebRtcVoiceEngineWithSendSideBweTest()
2196 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {} 1804 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2197 }; 1805 };
2198 1806
2199 TEST_F(WebRtcVoiceEngineWithSendSideBweTest, 1807 TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2337 // Set ISAC(16K) and CN(16K). VAD should be activated. 1945 // Set ISAC(16K) and CN(16K). VAD should be activated.
2338 parameters.codecs.push_back(kIsacCodec); 1946 parameters.codecs.push_back(kIsacCodec);
2339 parameters.codecs.push_back(kCn16000Codec); 1947 parameters.codecs.push_back(kCn16000Codec);
2340 parameters.codecs[1].id = 97; 1948 parameters.codecs[1].id = 97;
2341 SetSendParameters(parameters); 1949 SetSendParameters(parameters);
2342 1950
2343 // Verify ISAC and VAD are corrected configured on all send channels. 1951 // Verify ISAC and VAD are corrected configured on all send channels.
2344 for (uint32_t ssrc : kSsrcs4) { 1952 for (uint32_t ssrc : kSsrcs4) {
2345 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr); 1953 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2346 const auto& send_codec_spec = 1954 const auto& send_codec_spec =
2347 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec; 1955 *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2348 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname); 1956 EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
2349 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq); 1957 EXPECT_EQ(1, send_codec_spec.format.num_channels);
2350 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2351 EXPECT_EQ(97, send_codec_spec.cng_payload_type); 1958 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2352 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2353 } 1959 }
2354 1960
2355 // Change to PCMU(8K) and CN(16K). 1961 // Change to PCMU(8K) and CN(16K).
2356 parameters.codecs[0] = kPcmuCodec; 1962 parameters.codecs[0] = kPcmuCodec;
2357 SetSendParameters(parameters); 1963 SetSendParameters(parameters);
2358 for (uint32_t ssrc : kSsrcs4) { 1964 for (uint32_t ssrc : kSsrcs4) {
2359 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr); 1965 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2360 const auto& send_codec_spec = 1966 const auto& send_codec_spec =
2361 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec; 1967 *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2362 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname); 1968 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2363 EXPECT_EQ(-1, send_codec_spec.cng_payload_type); 1969 EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
2364 } 1970 }
2365 } 1971 }
2366 1972
2367 // Test we can SetSend on all send streams correctly. 1973 // Test we can SetSend on all send streams correctly.
2368 TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) { 1974 TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2369 SetupForMultiSendStream(); 1975 SetupForMultiSendStream();
2370 1976
2371 // Create the send channels and they should be a "not sending" date. 1977 // Create the send channels and they should be a "not sending" date.
2372 for (uint32_t ssrc : kSsrcs4) { 1978 for (uint32_t ssrc : kSsrcs4) {
2373 EXPECT_TRUE(channel_->AddSendStream( 1979 EXPECT_TRUE(channel_->AddSendStream(
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2549 } 2155 }
2550 2156
2551 TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) { 2157 TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2552 EXPECT_TRUE(SetupSendStream()); 2158 EXPECT_TRUE(SetupSendStream());
2553 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true); 2159 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2554 send_parameters_.options.audio_network_adaptor_config = 2160 send_parameters_.options.audio_network_adaptor_config =
2555 rtc::Optional<std::string>("1234"); 2161 rtc::Optional<std::string>("1234");
2556 SetSendParameters(send_parameters_); 2162 SetSendParameters(send_parameters_);
2557 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config, 2163 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2558 GetAudioNetworkAdaptorConfig(kSsrcX)); 2164 GetAudioNetworkAdaptorConfig(kSsrcX));
2559 const int initial_num = call_.GetNumCreatedSendStreams();
2560 cricket::AudioOptions options; 2165 cricket::AudioOptions options;
2561 options.audio_network_adaptor = rtc::Optional<bool>(false); 2166 options.audio_network_adaptor = rtc::Optional<bool>(false);
2562 SetAudioSend(kSsrcX, true, nullptr, &options); 2167 SetAudioSend(kSsrcX, true, nullptr, &options);
2563 // AudioSendStream expected to be recreated.
2564 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2565 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrcX)); 2168 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrcX));
2566 } 2169 }
2567 2170
2568 TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) { 2171 TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2569 EXPECT_TRUE(SetupSendStream()); 2172 EXPECT_TRUE(SetupSendStream());
2570 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true); 2173 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2571 send_parameters_.options.audio_network_adaptor_config = 2174 send_parameters_.options.audio_network_adaptor_config =
2572 rtc::Optional<std::string>("1234"); 2175 rtc::Optional<std::string>("1234");
2573 SetSendParameters(send_parameters_); 2176 SetSendParameters(send_parameters_);
2574 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config, 2177 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
3627 webrtc::RtcEventLogNullImpl event_log; 3230 webrtc::RtcEventLogNullImpl event_log;
3628 std::unique_ptr<webrtc::Call> call( 3231 std::unique_ptr<webrtc::Call> call(
3629 webrtc::Call::Create(webrtc::Call::Config(&event_log))); 3232 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
3630 cricket::VoiceMediaChannel* channel = engine.CreateChannel( 3233 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3631 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); 3234 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3632 EXPECT_TRUE(channel != nullptr); 3235 EXPECT_TRUE(channel != nullptr);
3633 delete channel; 3236 delete channel;
3634 } 3237 }
3635 } 3238 }
3636 3239
3637 // Tests that the library is configured with the codecs we want. 3240 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3638 TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) { 3241 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) {
3639 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3640 // module.
3641
3642 // Check codecs by name.
3643 #ifdef WEBRTC_CODEC_OPUS
3644 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3645 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
3646 #endif
3647 #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
3648 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3649 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
3650 #endif
3651 #if (defined(WEBRTC_CODEC_ISAC))
3652 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3653 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
3654 #endif
3655 #ifdef WEBRTC_CODEC_ILBC
3656 // Check that name matching is case-insensitive.
3657 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3658 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
3659 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3660 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
3661 #endif
3662 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3663 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
3664 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3665 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
3666 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3667 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
3668 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3669 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3670 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3671 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3672 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3673 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
3674 // Check codecs with an id by id.
3675 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3676 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
3677 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3678 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
3679 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3680 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
3681 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3682 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
3683 // Check sample/bitrate matching.
3684 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3685 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
3686 // Check that bad codecs fail.
3687 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3688 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
3689 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3690 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
3691 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3692 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
3693 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3694 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
3695 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3696 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
3697
3698 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3699 // TODO(ossu): Why are the payload types of codecs with non-static payload 3242 // TODO(ossu): Why are the payload types of codecs with non-static payload
3700 // type assignments checked here? It shouldn't really matter. 3243 // type assignments checked here? It shouldn't really matter.
3701 cricket::WebRtcVoiceEngine engine( 3244 cricket::WebRtcVoiceEngine engine(
3702 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); 3245 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
3703 for (const cricket::AudioCodec& codec : engine.send_codecs()) { 3246 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3704 if (codec.name == "CN" && codec.clockrate == 16000) { 3247 auto is_codec = [&codec](const char* name, int clockrate = 0) {
3248 return STR_CASE_CMP(codec.name.c_str(), name) == 0 &&
3249 (clockrate == 0 || codec.clockrate == clockrate);
3250 };
3251 if (is_codec("CN", 16000)) {
3705 EXPECT_EQ(105, codec.id); 3252 EXPECT_EQ(105, codec.id);
3706 } else if (codec.name == "CN" && codec.clockrate == 32000) { 3253 } else if (is_codec("CN", 32000)) {
3707 EXPECT_EQ(106, codec.id); 3254 EXPECT_EQ(106, codec.id);
3708 } else if (codec.name == "ISAC" && codec.clockrate == 16000) { 3255 } else if (is_codec("ISAC", 16000)) {
3709 EXPECT_EQ(103, codec.id); 3256 EXPECT_EQ(103, codec.id);
3710 } else if (codec.name == "ISAC" && codec.clockrate == 32000) { 3257 } else if (is_codec("ISAC", 32000)) {
3711 EXPECT_EQ(104, codec.id); 3258 EXPECT_EQ(104, codec.id);
3712 } else if (codec.name == "G722" && codec.clockrate == 8000) { 3259 } else if (is_codec("G722", 8000)) {
3713 EXPECT_EQ(9, codec.id); 3260 EXPECT_EQ(9, codec.id);
3714 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) { 3261 } else if (is_codec("telephone-event", 8000)) {
3715 EXPECT_EQ(126, codec.id); 3262 EXPECT_EQ(126, codec.id);
3716 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned. 3263 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3717 // Remove these checks once both send and receive side assigns payload types 3264 // Remove these checks once both send and receive side assigns payload types
3718 // dynamically. 3265 // dynamically.
3719 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) { 3266 } else if (is_codec("telephone-event", 16000)) {
3720 EXPECT_EQ(113, codec.id); 3267 EXPECT_EQ(113, codec.id);
3721 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) { 3268 } else if (is_codec("telephone-event", 32000)) {
3722 EXPECT_EQ(112, codec.id); 3269 EXPECT_EQ(112, codec.id);
3723 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) { 3270 } else if (is_codec("telephone-event", 48000)) {
3724 EXPECT_EQ(110, codec.id); 3271 EXPECT_EQ(110, codec.id);
3725 } else if (codec.name == "opus") { 3272 } else if (is_codec("opus")) {
3726 EXPECT_EQ(111, codec.id); 3273 EXPECT_EQ(111, codec.id);
3727 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end()); 3274 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3728 EXPECT_EQ("10", codec.params.find("minptime")->second); 3275 EXPECT_EQ("10", codec.params.find("minptime")->second);
3729 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end()); 3276 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3730 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); 3277 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
3731 } 3278 }
3732 } 3279 }
3733 } 3280 }
3734 3281
3735 // Tests that VoE supports at least 32 channels 3282 // Tests that VoE supports at least 32 channels
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
3844 // Without this cast, the comparison turned unsigned and, thus, failed for -1. 3391 // Without this cast, the comparison turned unsigned and, thus, failed for -1.
3845 const int num_specs = static_cast<int>(specs.size()); 3392 const int num_specs = static_cast<int>(specs.size());
3846 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); 3393 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs);
3847 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); 3394 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs);
3848 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); 3395 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1);
3849 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); 3396 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs);
3850 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); 3397 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs);
3851 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); 3398 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs);
3852 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); 3399 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs);
3853 } 3400 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698