Index: talk/media/webrtc/webrtcvoiceengine_unittest.cc |
diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc |
index a62bcb225fc7c6111fed44c0a43507f1ecf7b353..19cceb4b99362298f5e281f6497c897f49996f0c 100644 |
--- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc |
+++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc |
@@ -29,6 +29,8 @@ |
#include "webrtc/base/byteorder.h" |
#include "webrtc/base/gunit.h" |
#include "webrtc/call.h" |
+#include "webrtc/p2p/base/faketransportcontroller.h" |
+#include "webrtc/test/field_trial.h" |
#include "talk/media/base/constants.h" |
#include "talk/media/base/fakemediaengine.h" |
#include "talk/media/base/fakenetworkinterface.h" |
@@ -36,7 +38,6 @@ |
#include "talk/media/webrtc/fakewebrtccall.h" |
#include "talk/media/webrtc/fakewebrtcvoiceengine.h" |
#include "talk/media/webrtc/webrtcvoiceengine.h" |
-#include "webrtc/p2p/base/faketransportcontroller.h" |
#include "talk/session/media/channel.h" |
using cricket::kRtpAudioLevelHeaderExtension; |
@@ -74,10 +75,13 @@ class FakeVoEWrapper : public cricket::VoEWrapper { |
class WebRtcVoiceEngineTestFake : public testing::Test { |
public: |
- WebRtcVoiceEngineTestFake() |
+ explicit WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {} |
+ |
+ explicit WebRtcVoiceEngineTestFake(const char* field_trials) |
: call_(webrtc::Call::Config()), |
engine_(new FakeVoEWrapper(&voe_)), |
- channel_(nullptr) { |
+ channel_(nullptr), |
+ override_field_trials_(field_trials) { |
send_parameters_.codecs.push_back(kPcmuCodec); |
recv_parameters_.codecs.push_back(kPcmuCodec); |
} |
@@ -281,6 +285,29 @@ class WebRtcVoiceEngineTestFake : public testing::Test { |
EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size()); |
} |
+ void TestExtensionFilter(const std::vector<std::string>& extensions, |
+ const std::string& expected_extension) { |
+ EXPECT_TRUE(SetupEngineWithSendStream()); |
+ cricket::AudioSendParameters parameters = send_parameters_; |
+ int expected_id = -1; |
+ int id = 1; |
+ for (const std::string& extension : extensions) { |
+ if (extension == expected_extension) |
+ expected_id = id; |
+ parameters.extensions.push_back( |
+ cricket::RtpHeaderExtension(extension, id++)); |
+ } |
+ EXPECT_TRUE(channel_->SetSendParameters(parameters)); |
+ const cricket::FakeAudioSendStream send_stream = GetSendStream(kSsrc1); |
+ |
+ // Verify that only one of them has been set, and that it is the one with |
+ // highest priority (transport sequence number). |
+ ASSERT_EQ(1u, send_stream.GetConfig().rtp.extensions.size()); |
+ EXPECT_EQ(expected_id, send_stream.GetConfig().rtp.extensions[0].id); |
+ EXPECT_EQ(expected_extension, |
+ send_stream.GetConfig().rtp.extensions[0].name); |
+ } |
+ |
webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const { |
webrtc::AudioSendStream::Stats stats; |
stats.local_ssrc = 12; |
@@ -399,6 +426,9 @@ class WebRtcVoiceEngineTestFake : public testing::Test { |
cricket::VoiceMediaChannel* channel_; |
cricket::AudioSendParameters send_parameters_; |
cricket::AudioRecvParameters recv_parameters_; |
+ |
+ private: |
+ webrtc::test::ScopedFieldTrials override_field_trials_; |
}; |
// Tests that our stub library "works". |
@@ -433,6 +463,18 @@ TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) { |
} |
} |
+TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) { |
+ const std::vector<cricket::AudioCodec>& codecs = engine_.codecs(); |
+ bool opus_found = false; |
+ for (cricket::AudioCodec codec : codecs) { |
+ if (codec.name == "opus") { |
+ EXPECT_TRUE(HasTransportCc(codec)); |
+ opus_found = true; |
+ } |
+ } |
+ EXPECT_TRUE(opus_found); |
+} |
+ |
// Tests that we can find codecs by name or id, and that we interpret the |
// clockrate and bitrate fields properly. |
TEST_F(WebRtcVoiceEngineTestFake, FindCodec) { |
@@ -1276,6 +1318,29 @@ TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) { |
EXPECT_TRUE(voe_.GetCodecFEC(channel_num)); |
} |
+TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) { |
+ EXPECT_TRUE(SetupEngine()); |
+ cricket::AudioSendParameters send_parameters; |
+ send_parameters.codecs.push_back(kOpusCodec); |
+ EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty()); |
+ EXPECT_TRUE(channel_->SetSendParameters(send_parameters)); |
+ |
+ cricket::AudioRecvParameters recv_parameters; |
+ recv_parameters.codecs.push_back(kOpusCodec); |
+ EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters)); |
+ EXPECT_TRUE( |
+ channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1))); |
+ ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr); |
+ EXPECT_FALSE( |
+ call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc); |
+ |
+ send_parameters.codecs = engine_.codecs(); |
+ EXPECT_TRUE(channel_->SetSendParameters(send_parameters)); |
+ ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr); |
+ EXPECT_TRUE( |
+ call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc); |
+} |
+ |
// Test maxplaybackrate <= 8000 triggers Opus narrow band mode. |
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) { |
EXPECT_TRUE(SetupEngineWithSendStream()); |
@@ -1918,6 +1983,37 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) { |
EXPECT_FALSE(voe_.GetRED(channel_num)); |
} |
+class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake { |
+ public: |
+ WebRtcVoiceEngineWithSendSideBweTest() |
+ : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {} |
+}; |
+ |
+TEST_F(WebRtcVoiceEngineWithSendSideBweTest, |
+ SupportsTransportSequenceNumberHeaderExtension) { |
+ cricket::RtpCapabilities capabilities = engine_.GetCapabilities(); |
+ ASSERT_FALSE(capabilities.header_extensions.empty()); |
+ for (const cricket::RtpHeaderExtension& extension : |
+ capabilities.header_extensions) { |
+ if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) { |
+ EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId, |
+ extension.id); |
+ return; |
+ } |
+ } |
+ FAIL() << "Transport sequence number extension not in header-extension list."; |
+} |
+ |
+TEST_F(WebRtcVoiceEngineWithSendSideBweTest, |
+ FiltersExtensionsPicksTransportSeqNum) { |
+ // Enable three redundant extensions. |
+ std::vector<std::string> extensions; |
+ extensions.push_back(cricket::kRtpAbsoluteSenderTimeHeaderExtension); |
+ extensions.push_back(cricket::kRtpTransportSequenceNumberHeaderExtension); |
+ TestExtensionFilter(extensions, |
+ cricket::kRtpTransportSequenceNumberHeaderExtension); |
+} |
+ |
// Test support for audio level header extension. |
TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) { |
TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension); |