diff options
Diffstat (limited to 'media/webrtc/webrtcvoiceengine_unittest.cc')
-rw-r--r-- | media/webrtc/webrtcvoiceengine_unittest.cc | 265 |
1 files changed, 264 insertions, 1 deletions
diff --git a/media/webrtc/webrtcvoiceengine_unittest.cc b/media/webrtc/webrtcvoiceengine_unittest.cc index 89d4c4d..b044e92 100644 --- a/media/webrtc/webrtcvoiceengine_unittest.cc +++ b/media/webrtc/webrtcvoiceengine_unittest.cc @@ -38,6 +38,7 @@ #include "talk/media/base/fakenetworkinterface.h" #include "talk/media/base/fakertp.h" #include "talk/media/webrtc/fakewebrtcvoiceengine.h" +#include "talk/media/webrtc/webrtcvie.h" #include "talk/media/webrtc/webrtcvoiceengine.h" #include "talk/p2p/base/fakesession.h" #include "talk/session/media/channel.h" @@ -1151,7 +1152,6 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) { int channel_num = voe_.GetLastChannel(); std::vector<cricket::AudioCodec> codecs; codecs.push_back(kOpusCodec); - codecs[0].bitrate = 0; EXPECT_TRUE(channel_->SetSendCodecs(codecs)); EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); } @@ -1228,6 +1228,159 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) { EXPECT_TRUE(channel_->SetSendCodecs(codecs)); EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); } + +// Test that Opus FEC status can be changed. +TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_FALSE(voe_.GetCodecFEC(channel_num)); + codecs[0].params["useinbandfec"] = "1"; + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_TRUE(voe_.GetCodecFEC(channel_num)); +} + +// Test maxplaybackrate <= 8000 triggers Opus narrow band mode. +TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + codecs[0].bitrate = 0; + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthNb, + voe_.GetMaxEncodingBandwidth(channel_num)); + webrtc::CodecInst gcodec; + EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); + EXPECT_STREQ("opus", gcodec.plname); + // TODO(minyue): Default bit rate is not but can in future be affected by + // kCodecParamMaxPlaybackRate. + EXPECT_EQ(32000, gcodec.rate); +} + +// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode. +TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + codecs[0].bitrate = 0; + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthMb, + voe_.GetMaxEncodingBandwidth(channel_num)); + webrtc::CodecInst gcodec; + EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); + EXPECT_STREQ("opus", gcodec.plname); + // TODO(minyue): Default bit rate is not but can in future be affected by + // kCodecParamMaxPlaybackRate. + EXPECT_EQ(32000, gcodec.rate); +} + +// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode. +TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + codecs[0].bitrate = 0; + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthWb, + voe_.GetMaxEncodingBandwidth(channel_num)); + webrtc::CodecInst gcodec; + EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); + EXPECT_STREQ("opus", gcodec.plname); + // TODO(minyue): Default bit rate is not but can in future be affected by + // kCodecParamMaxPlaybackRate. + EXPECT_EQ(32000, gcodec.rate); +} + +// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode. +TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + codecs[0].bitrate = 0; + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthSwb, + voe_.GetMaxEncodingBandwidth(channel_num)); + webrtc::CodecInst gcodec; + EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); + EXPECT_STREQ("opus", gcodec.plname); + // TODO(minyue): Default bit rate is not but can in future be affected by + // kCodecParamMaxPlaybackRate. + EXPECT_EQ(32000, gcodec.rate); +} + +// Test 24000 < maxplaybackrate triggers Opus full band mode. +TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + codecs[0].bitrate = 0; + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthFb, + voe_.GetMaxEncodingBandwidth(channel_num)); + webrtc::CodecInst gcodec; + EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec)); + EXPECT_STREQ("opus", gcodec.plname); + // TODO(minyue): Default bit rate is not but can in future be affected by + // kCodecParamMaxPlaybackRate. + EXPECT_EQ(32000, gcodec.rate); +} + +// Test Opus that without maxplaybackrate, default playback rate is used. +TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthFb, + voe_.GetMaxEncodingBandwidth(channel_num)); +} + +// Test the with non-Opus, maxplaybackrate has no effect. +TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kIsacCodec); + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num)); +} + +// Test maxplaybackrate can be set on two streams. +TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) { + EXPECT_TRUE(SetupEngine()); + int channel_num = voe_.GetLastChannel(); + std::vector<cricket::AudioCodec> codecs; + codecs.push_back(kOpusCodec); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + // Default bandwidth is 24000. + EXPECT_EQ(cricket::kOpusBandwidthFb, + voe_.GetMaxEncodingBandwidth(channel_num)); + + codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000); + + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + EXPECT_EQ(cricket::kOpusBandwidthNb, + voe_.GetMaxEncodingBandwidth(channel_num)); + + channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2)); + channel_num = voe_.GetLastChannel(); + EXPECT_EQ(cricket::kOpusBandwidthNb, + voe_.GetMaxEncodingBandwidth(channel_num)); +} #endif // USE_WEBRTC_DEV_BRANCH // Test that we can apply CELT with stereo mode but fail with mono mode. @@ -3160,3 +3313,113 @@ TEST(WebRtcVoiceEngineTest, CoInitialize) { CoUninitialize(); } #endif + +TEST_F(WebRtcVoiceEngineTestFake, ChangeCombinedAudioVideoBweOption) { + // Test that changing the combined_audio_video_bwe option results in the + // expected state changes in VoiceEngine. + cricket::ViEWrapper vie; + const int kVieCh = 667; + + EXPECT_TRUE(SetupEngine()); + cricket::WebRtcVoiceMediaChannel* media_channel = + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie.engine(), + kVieCh)); + EXPECT_TRUE(media_channel->AddRecvStream( + cricket::StreamParams::CreateLegacy(2))); + int recv_ch = voe_.GetLastChannel(); + + // Combined BWE should not be set up yet. + EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); + + // Enable combined BWE option - now it should be set up. + cricket::AudioOptions options; + options.combined_audio_video_bwe.Set(true); + EXPECT_TRUE(media_channel->SetOptions(options)); + EXPECT_EQ(vie.network(), voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(kVieCh, voe_.GetVideoChannel(recv_ch)); + + // Disable combined BWE option - should be disabled again. + options.combined_audio_video_bwe.Set(false); + EXPECT_TRUE(media_channel->SetOptions(options)); + EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); + + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1)); +} + +TEST_F(WebRtcVoiceEngineTestFake, SetupSharedBandwidthEstimation) { + // Test that calling SetupSharedBandwidthEstimation() on the voice media + // channel results in the expected state changes in VoiceEngine. + cricket::ViEWrapper vie1; + cricket::ViEWrapper vie2; + const int kVieCh1 = 667; + const int kVieCh2 = 70; + + EXPECT_TRUE(SetupEngine()); + cricket::WebRtcVoiceMediaChannel* media_channel = + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); + cricket::AudioOptions options; + options.combined_audio_video_bwe.Set(true); + EXPECT_TRUE(media_channel->SetOptions(options)); + EXPECT_TRUE(media_channel->AddRecvStream( + cricket::StreamParams::CreateLegacy(2))); + int recv_ch = voe_.GetLastChannel(); + + // Combined BWE should not be set up yet. + EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); + + // Register - should be enabled. + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie1.engine(), + kVieCh1)); + EXPECT_EQ(vie1.network(), voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(kVieCh1, voe_.GetVideoChannel(recv_ch)); + + // Re-register - should still be enabled. + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie2.engine(), + kVieCh2)); + EXPECT_EQ(vie2.network(), voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(kVieCh2, voe_.GetVideoChannel(recv_ch)); + + // Unregister - should be disabled again. + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1)); + EXPECT_EQ(NULL, voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(-1, voe_.GetVideoChannel(recv_ch)); +} + +TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) { + // Test that adding receive streams after enabling combined bandwidth + // estimation will correctly configure each channel. + cricket::ViEWrapper vie; + const int kVieCh = 667; + + EXPECT_TRUE(SetupEngine()); + cricket::WebRtcVoiceMediaChannel* media_channel = + static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_); + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(vie.engine(), + kVieCh)); + cricket::AudioOptions options; + options.combined_audio_video_bwe.Set(true); + EXPECT_TRUE(media_channel->SetOptions(options)); + + static const uint32 kSsrcs[] = {1, 2, 3, 4}; + int voe_channels[ARRAY_SIZE(kSsrcs)] = {0}; + for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) { + EXPECT_TRUE(media_channel->AddRecvStream( + cricket::StreamParams::CreateLegacy(kSsrcs[i]))); + int recv_ch = media_channel->GetReceiveChannelNum(kSsrcs[i]); + EXPECT_NE(-1, recv_ch); + voe_channels[i] = recv_ch; + EXPECT_EQ(vie.network(), voe_.GetViENetwork(recv_ch)); + EXPECT_EQ(kVieCh, voe_.GetVideoChannel(recv_ch)); + } + + EXPECT_TRUE(media_channel->SetupSharedBandwidthEstimation(NULL, -1)); + + for (unsigned int i = 0; i < ARRAY_SIZE(voe_channels); ++i) { + EXPECT_EQ(NULL, voe_.GetViENetwork(voe_channels[i])); + EXPECT_EQ(-1, voe_.GetVideoChannel(voe_channels[i])); + } +} |