| OLD | NEW |
| 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 |
| 11 #include <memory> |
| 12 |
| 11 #include "webrtc/pc/channel.h" | 13 #include "webrtc/pc/channel.h" |
| 12 #include "webrtc/base/arraysize.h" | 14 #include "webrtc/base/arraysize.h" |
| 13 #include "webrtc/base/byteorder.h" | 15 #include "webrtc/base/byteorder.h" |
| 14 #include "webrtc/base/gunit.h" | 16 #include "webrtc/base/gunit.h" |
| 15 #include "webrtc/call.h" | 17 #include "webrtc/call.h" |
| 16 #include "webrtc/p2p/base/faketransportcontroller.h" | 18 #include "webrtc/p2p/base/faketransportcontroller.h" |
| 17 #include "webrtc/test/field_trial.h" | 19 #include "webrtc/test/field_trial.h" |
| 18 #include "webrtc/media/base/constants.h" | 20 #include "webrtc/media/base/constants.h" |
| 19 #include "webrtc/media/base/fakemediaengine.h" | 21 #include "webrtc/media/base/fakemediaengine.h" |
| 20 #include "webrtc/media/base/fakenetworkinterface.h" | 22 #include "webrtc/media/base/fakenetworkinterface.h" |
| (...skipping 2754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2775 webrtc::AgcConfig config = {0}; | 2777 webrtc::AgcConfig config = {0}; |
| 2776 EXPECT_EQ(0, voe_.GetAgcConfig(config)); | 2778 EXPECT_EQ(0, voe_.GetAgcConfig(config)); |
| 2777 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv); | 2779 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv); |
| 2778 EXPECT_EQ(set_config.digitalCompressionGaindB, | 2780 EXPECT_EQ(set_config.digitalCompressionGaindB, |
| 2779 config.digitalCompressionGaindB); | 2781 config.digitalCompressionGaindB); |
| 2780 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable); | 2782 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable); |
| 2781 } | 2783 } |
| 2782 | 2784 |
| 2783 TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) { | 2785 TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) { |
| 2784 EXPECT_TRUE(SetupEngineWithSendStream()); | 2786 EXPECT_TRUE(SetupEngineWithSendStream()); |
| 2785 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1( | 2787 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1( |
| 2786 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel( | 2788 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel( |
| 2787 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); | 2789 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); |
| 2788 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2( | 2790 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2( |
| 2789 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel( | 2791 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel( |
| 2790 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); | 2792 &call_, cricket::MediaConfig(), cricket::AudioOptions()))); |
| 2791 | 2793 |
| 2792 // Have to add a stream to make SetSend work. | 2794 // Have to add a stream to make SetSend work. |
| 2793 cricket::StreamParams stream1; | 2795 cricket::StreamParams stream1; |
| 2794 stream1.ssrcs.push_back(1); | 2796 stream1.ssrcs.push_back(1); |
| 2795 channel1->AddSendStream(stream1); | 2797 channel1->AddSendStream(stream1); |
| 2796 cricket::StreamParams stream2; | 2798 cricket::StreamParams stream2; |
| 2797 stream2.ssrcs.push_back(2); | 2799 stream2.ssrcs.push_back(2); |
| 2798 channel2->AddSendStream(stream2); | 2800 channel2->AddSendStream(stream2); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2878 EXPECT_TRUE(ec_enabled); | 2880 EXPECT_TRUE(ec_enabled); |
| 2879 EXPECT_FALSE(agc_enabled); | 2881 EXPECT_FALSE(agc_enabled); |
| 2880 EXPECT_FALSE(ns_enabled); | 2882 EXPECT_FALSE(ns_enabled); |
| 2881 } | 2883 } |
| 2882 | 2884 |
| 2883 // This test verifies DSCP settings are properly applied on voice media channel. | 2885 // This test verifies DSCP settings are properly applied on voice media channel. |
| 2884 TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) { | 2886 TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) { |
| 2885 EXPECT_TRUE(SetupEngineWithSendStream()); | 2887 EXPECT_TRUE(SetupEngineWithSendStream()); |
| 2886 cricket::FakeNetworkInterface network_interface; | 2888 cricket::FakeNetworkInterface network_interface; |
| 2887 cricket::MediaConfig config; | 2889 cricket::MediaConfig config; |
| 2888 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel; | 2890 std::unique_ptr<cricket::VoiceMediaChannel> channel; |
| 2889 | 2891 |
| 2890 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions())); | 2892 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions())); |
| 2891 channel->SetInterface(&network_interface); | 2893 channel->SetInterface(&network_interface); |
| 2892 // Default value when DSCP is disabled should be DSCP_DEFAULT. | 2894 // Default value when DSCP is disabled should be DSCP_DEFAULT. |
| 2893 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp()); | 2895 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp()); |
| 2894 | 2896 |
| 2895 config.enable_dscp = true; | 2897 config.enable_dscp = true; |
| 2896 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions())); | 2898 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions())); |
| 2897 channel->SetInterface(&network_interface); | 2899 channel->SetInterface(&network_interface); |
| 2898 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp()); | 2900 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp()); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3106 // So we force the |recv_ch| to associate with a non-default channel. | 3108 // So we force the |recv_ch| to associate with a non-default channel. |
| 3107 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch)); | 3109 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch)); |
| 3108 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch); | 3110 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch); |
| 3109 | 3111 |
| 3110 EXPECT_TRUE(channel_->RemoveSendStream(2)); | 3112 EXPECT_TRUE(channel_->RemoveSendStream(2)); |
| 3111 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1); | 3113 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1); |
| 3112 } | 3114 } |
| 3113 | 3115 |
| 3114 TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) { | 3116 TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) { |
| 3115 EXPECT_TRUE(SetupEngine()); | 3117 EXPECT_TRUE(SetupEngine()); |
| 3116 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink()); | 3118 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink()); |
| 3117 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink()); | 3119 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink()); |
| 3118 | 3120 |
| 3119 // Setting the sink before a recv stream exists should do nothing. | 3121 // Setting the sink before a recv stream exists should do nothing. |
| 3120 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1)); | 3122 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1)); |
| 3121 EXPECT_TRUE( | 3123 EXPECT_TRUE( |
| 3122 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1))); | 3124 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1))); |
| 3123 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink()); | 3125 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink()); |
| 3124 | 3126 |
| 3125 // Now try actually setting the sink. | 3127 // Now try actually setting the sink. |
| 3126 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2)); | 3128 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2)); |
| 3127 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink()); | 3129 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink()); |
| 3128 | 3130 |
| 3129 // Now try resetting it. | 3131 // Now try resetting it. |
| 3130 channel_->SetRawAudioSink(kSsrc1, nullptr); | 3132 channel_->SetRawAudioSink(kSsrc1, nullptr); |
| 3131 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink()); | 3133 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink()); |
| 3132 } | 3134 } |
| 3133 | 3135 |
| 3134 TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) { | 3136 TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) { |
| 3135 EXPECT_TRUE(SetupEngine()); | 3137 EXPECT_TRUE(SetupEngine()); |
| 3136 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink()); | 3138 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink()); |
| 3137 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink()); | 3139 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink()); |
| 3138 | 3140 |
| 3139 // Should be able to set a default sink even when no stream exists. | 3141 // Should be able to set a default sink even when no stream exists. |
| 3140 channel_->SetRawAudioSink(0, std::move(fake_sink_1)); | 3142 channel_->SetRawAudioSink(0, std::move(fake_sink_1)); |
| 3141 | 3143 |
| 3142 // Create default channel and ensure it's assigned the default sink. | 3144 // Create default channel and ensure it's assigned the default sink. |
| 3143 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); | 3145 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); |
| 3144 EXPECT_NE(nullptr, GetRecvStream(0x01).sink()); | 3146 EXPECT_NE(nullptr, GetRecvStream(0x01).sink()); |
| 3145 | 3147 |
| 3146 // Try resetting the default sink. | 3148 // Try resetting the default sink. |
| 3147 channel_->SetRawAudioSink(0, nullptr); | 3149 channel_->SetRawAudioSink(0, nullptr); |
| 3148 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink()); | 3150 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink()); |
| 3149 | 3151 |
| 3150 // Try setting the default sink while the default stream exists. | 3152 // Try setting the default sink while the default stream exists. |
| 3151 channel_->SetRawAudioSink(0, std::move(fake_sink_2)); | 3153 channel_->SetRawAudioSink(0, std::move(fake_sink_2)); |
| 3152 EXPECT_NE(nullptr, GetRecvStream(0x01).sink()); | 3154 EXPECT_NE(nullptr, GetRecvStream(0x01).sink()); |
| 3153 | 3155 |
| 3154 // If we remove and add a default stream, it should get the same sink. | 3156 // If we remove and add a default stream, it should get the same sink. |
| 3155 EXPECT_TRUE(channel_->RemoveRecvStream(0x01)); | 3157 EXPECT_TRUE(channel_->RemoveRecvStream(0x01)); |
| 3156 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); | 3158 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame)); |
| 3157 EXPECT_NE(nullptr, GetRecvStream(0x01).sink()); | 3159 EXPECT_NE(nullptr, GetRecvStream(0x01).sink()); |
| 3158 } | 3160 } |
| 3159 | 3161 |
| 3160 // Tests that the library initializes and shuts down properly. | 3162 // Tests that the library initializes and shuts down properly. |
| 3161 TEST(WebRtcVoiceEngineTest, StartupShutdown) { | 3163 TEST(WebRtcVoiceEngineTest, StartupShutdown) { |
| 3162 cricket::WebRtcVoiceEngine engine; | 3164 cricket::WebRtcVoiceEngine engine; |
| 3163 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); | 3165 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); |
| 3164 rtc::scoped_ptr<webrtc::Call> call( | 3166 std::unique_ptr<webrtc::Call> call( |
| 3165 webrtc::Call::Create(webrtc::Call::Config())); | 3167 webrtc::Call::Create(webrtc::Call::Config())); |
| 3166 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3168 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
| 3167 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3169 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
| 3168 EXPECT_TRUE(channel != nullptr); | 3170 EXPECT_TRUE(channel != nullptr); |
| 3169 delete channel; | 3171 delete channel; |
| 3170 engine.Terminate(); | 3172 engine.Terminate(); |
| 3171 | 3173 |
| 3172 // Reinit to catch regression where VoiceEngineObserver reference is lost | 3174 // Reinit to catch regression where VoiceEngineObserver reference is lost |
| 3173 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); | 3175 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); |
| 3174 engine.Terminate(); | 3176 engine.Terminate(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3256 EXPECT_EQ("1", it->params.find("useinbandfec")->second); | 3258 EXPECT_EQ("1", it->params.find("useinbandfec")->second); |
| 3257 } | 3259 } |
| 3258 } | 3260 } |
| 3259 engine.Terminate(); | 3261 engine.Terminate(); |
| 3260 } | 3262 } |
| 3261 | 3263 |
| 3262 // Tests that VoE supports at least 32 channels | 3264 // Tests that VoE supports at least 32 channels |
| 3263 TEST(WebRtcVoiceEngineTest, Has32Channels) { | 3265 TEST(WebRtcVoiceEngineTest, Has32Channels) { |
| 3264 cricket::WebRtcVoiceEngine engine; | 3266 cricket::WebRtcVoiceEngine engine; |
| 3265 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); | 3267 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); |
| 3266 rtc::scoped_ptr<webrtc::Call> call( | 3268 std::unique_ptr<webrtc::Call> call( |
| 3267 webrtc::Call::Create(webrtc::Call::Config())); | 3269 webrtc::Call::Create(webrtc::Call::Config())); |
| 3268 | 3270 |
| 3269 cricket::VoiceMediaChannel* channels[32]; | 3271 cricket::VoiceMediaChannel* channels[32]; |
| 3270 int num_channels = 0; | 3272 int num_channels = 0; |
| 3271 while (num_channels < arraysize(channels)) { | 3273 while (num_channels < arraysize(channels)) { |
| 3272 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3274 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
| 3273 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3275 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); |
| 3274 if (!channel) | 3276 if (!channel) |
| 3275 break; | 3277 break; |
| 3276 channels[num_channels++] = channel; | 3278 channels[num_channels++] = channel; |
| 3277 } | 3279 } |
| 3278 | 3280 |
| 3279 int expected = arraysize(channels); | 3281 int expected = arraysize(channels); |
| 3280 EXPECT_EQ(expected, num_channels); | 3282 EXPECT_EQ(expected, num_channels); |
| 3281 | 3283 |
| 3282 while (num_channels > 0) { | 3284 while (num_channels > 0) { |
| 3283 delete channels[--num_channels]; | 3285 delete channels[--num_channels]; |
| 3284 } | 3286 } |
| 3285 engine.Terminate(); | 3287 engine.Terminate(); |
| 3286 } | 3288 } |
| 3287 | 3289 |
| 3288 // Test that we set our preferred codecs properly. | 3290 // Test that we set our preferred codecs properly. |
| 3289 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { | 3291 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { |
| 3290 cricket::WebRtcVoiceEngine engine; | 3292 cricket::WebRtcVoiceEngine engine; |
| 3291 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); | 3293 EXPECT_TRUE(engine.Init(rtc::Thread::Current())); |
| 3292 rtc::scoped_ptr<webrtc::Call> call( | 3294 std::unique_ptr<webrtc::Call> call( |
| 3293 webrtc::Call::Create(webrtc::Call::Config())); | 3295 webrtc::Call::Create(webrtc::Call::Config())); |
| 3294 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), | 3296 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), |
| 3295 cricket::AudioOptions(), call.get()); | 3297 cricket::AudioOptions(), call.get()); |
| 3296 cricket::AudioRecvParameters parameters; | 3298 cricket::AudioRecvParameters parameters; |
| 3297 parameters.codecs = engine.codecs(); | 3299 parameters.codecs = engine.codecs(); |
| 3298 EXPECT_TRUE(channel.SetRecvParameters(parameters)); | 3300 EXPECT_TRUE(channel.SetRecvParameters(parameters)); |
| 3299 } | 3301 } |
| OLD | NEW |