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> | 11 #include <memory> |
12 | 12 |
13 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" | 13 #include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" |
14 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" | 14 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" |
15 #include "webrtc/base/arraysize.h" | 15 #include "webrtc/base/arraysize.h" |
16 #include "webrtc/base/byteorder.h" | 16 #include "webrtc/base/byteorder.h" |
| 17 #include "webrtc/base/ptr_util.h" |
17 #include "webrtc/base/safe_conversions.h" | 18 #include "webrtc/base/safe_conversions.h" |
18 #include "webrtc/call/call.h" | 19 #include "webrtc/call/call.h" |
| 20 #include "webrtc/call/rtp_transport_controller_send.h" |
19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 21 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
20 #include "webrtc/media/base/fakemediaengine.h" | 22 #include "webrtc/media/base/fakemediaengine.h" |
21 #include "webrtc/media/base/fakenetworkinterface.h" | 23 #include "webrtc/media/base/fakenetworkinterface.h" |
22 #include "webrtc/media/base/fakertp.h" | 24 #include "webrtc/media/base/fakertp.h" |
23 #include "webrtc/media/base/mediaconstants.h" | 25 #include "webrtc/media/base/mediaconstants.h" |
24 #include "webrtc/media/engine/fakewebrtccall.h" | 26 #include "webrtc/media/engine/fakewebrtccall.h" |
25 #include "webrtc/media/engine/fakewebrtcvoiceengine.h" | 27 #include "webrtc/media/engine/fakewebrtcvoiceengine.h" |
26 #include "webrtc/media/engine/webrtcvoiceengine.h" | 28 #include "webrtc/media/engine/webrtcvoiceengine.h" |
27 #include "webrtc/modules/audio_device/include/mock_audio_device.h" | 29 #include "webrtc/modules/audio_device/include/mock_audio_device.h" |
28 #include "webrtc/modules/audio_processing/include/mock_audio_processing.h" | 30 #include "webrtc/modules/audio_processing/include/mock_audio_processing.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 #endif // #if defined(WEBRTC_WIN) | 110 #endif // #if defined(WEBRTC_WIN) |
109 EXPECT_CALL(*adm, InitSpeaker()).WillOnce(Return(0)); | 111 EXPECT_CALL(*adm, InitSpeaker()).WillOnce(Return(0)); |
110 EXPECT_CALL(*adm, StereoPlayoutIsAvailable(testing::_)).WillOnce(Return(0)); | 112 EXPECT_CALL(*adm, StereoPlayoutIsAvailable(testing::_)).WillOnce(Return(0)); |
111 EXPECT_CALL(*adm, SetStereoPlayout(false)).WillOnce(Return(0)); | 113 EXPECT_CALL(*adm, SetStereoPlayout(false)).WillOnce(Return(0)); |
112 #endif // #if !defined(WEBRTC_IOS) | 114 #endif // #if !defined(WEBRTC_IOS) |
113 EXPECT_CALL(*adm, BuiltInAECIsAvailable()).WillOnce(Return(false)); | 115 EXPECT_CALL(*adm, BuiltInAECIsAvailable()).WillOnce(Return(false)); |
114 EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false)); | 116 EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false)); |
115 EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false)); | 117 EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false)); |
116 EXPECT_CALL(*adm, SetAGC(true)).WillOnce(Return(0)); | 118 EXPECT_CALL(*adm, SetAGC(true)).WillOnce(Return(0)); |
117 } | 119 } |
| 120 |
| 121 // Helper class to construct and own Call and the RtcEventLog and |
| 122 // RtpTransportControllerSend it depends on. |
| 123 class CallHelper { |
| 124 public: |
| 125 CallHelper() |
| 126 : rtp_transport_controller_send_( |
| 127 rtc::MakeUnique<webrtc::RtpTransportControllerSend>( |
| 128 webrtc::Clock::GetRealTimeClock(), &event_log_)) { |
| 129 webrtc::Call::Config call_config(&event_log_); |
| 130 call_config.audio_rtp_transport_send = rtp_transport_controller_send_.get(); |
| 131 call_config.video_rtp_transport_send = rtp_transport_controller_send_.get(); |
| 132 call_config.send_side_cc = rtp_transport_controller_send_->send_side_cc(); |
| 133 call_ = rtc::WrapUnique(webrtc::Call::Create(call_config)); |
| 134 } |
| 135 webrtc::Call* call() { return call_.get(); } |
| 136 private: |
| 137 webrtc::RtcEventLogNullImpl event_log_; |
| 138 const std::unique_ptr<webrtc::RtpTransportControllerSendInterface> |
| 139 rtp_transport_controller_send_; |
| 140 std::unique_ptr<webrtc::Call> call_; |
| 141 }; |
| 142 |
118 } // namespace | 143 } // namespace |
119 | 144 |
120 // Tests that our stub library "works". | 145 // Tests that our stub library "works". |
121 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { | 146 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) { |
122 StrictMock<webrtc::test::MockAudioDeviceModule> adm; | 147 StrictMock<webrtc::test::MockAudioDeviceModule> adm; |
123 AdmSetupExpectations(&adm); | 148 AdmSetupExpectations(&adm); |
124 StrictMock<webrtc::test::MockAudioProcessing> apm; | 149 StrictMock<webrtc::test::MockAudioProcessing> apm; |
125 EXPECT_CALL(apm, ApplyConfig(testing::_)); | 150 EXPECT_CALL(apm, ApplyConfig(testing::_)); |
126 EXPECT_CALL(apm, SetExtraOptions(testing::_)); | 151 EXPECT_CALL(apm, SetExtraOptions(testing::_)); |
127 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0)); | 152 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0)); |
(...skipping 3128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3256 EXPECT_TRUE(GetRecvStream(kSsrcX).started()); | 3281 EXPECT_TRUE(GetRecvStream(kSsrcX).started()); |
3257 } | 3282 } |
3258 | 3283 |
3259 // Tests that the library initializes and shuts down properly. | 3284 // Tests that the library initializes and shuts down properly. |
3260 TEST(WebRtcVoiceEngineTest, StartupShutdown) { | 3285 TEST(WebRtcVoiceEngineTest, StartupShutdown) { |
3261 // If the VoiceEngine wants to gather available codecs early, that's fine but | 3286 // If the VoiceEngine wants to gather available codecs early, that's fine but |
3262 // we never want it to create a decoder at this stage. | 3287 // we never want it to create a decoder at this stage. |
3263 cricket::WebRtcVoiceEngine engine( | 3288 cricket::WebRtcVoiceEngine engine( |
3264 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3289 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
3265 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3290 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); |
3266 webrtc::RtcEventLogNullImpl event_log; | 3291 CallHelper call_helper; |
3267 std::unique_ptr<webrtc::Call> call( | |
3268 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | |
3269 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3292 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
3270 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3293 call_helper.call(), cricket::MediaConfig(), cricket::AudioOptions()); |
3271 EXPECT_TRUE(channel != nullptr); | 3294 EXPECT_TRUE(channel != nullptr); |
3272 delete channel; | 3295 delete channel; |
3273 } | 3296 } |
3274 | 3297 |
3275 // Tests that reference counting on the external ADM is correct. | 3298 // Tests that reference counting on the external ADM is correct. |
3276 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { | 3299 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { |
3277 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; | 3300 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; |
3278 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); | 3301 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); |
3279 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); | 3302 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); |
3280 // Return 100ms just in case this function gets called. If we don't, | 3303 // Return 100ms just in case this function gets called. If we don't, |
3281 // we could enter a tight loop since the mock would return 0. | 3304 // we could enter a tight loop since the mock would return 0. |
3282 EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100)); | 3305 EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100)); |
3283 { | 3306 { |
3284 cricket::WebRtcVoiceEngine engine( | 3307 cricket::WebRtcVoiceEngine engine( |
3285 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3308 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
3286 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3309 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); |
3287 webrtc::RtcEventLogNullImpl event_log; | 3310 CallHelper call_helper; |
3288 std::unique_ptr<webrtc::Call> call( | |
3289 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | |
3290 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3311 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
3291 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3312 call_helper.call(), cricket::MediaConfig(), cricket::AudioOptions()); |
3292 EXPECT_TRUE(channel != nullptr); | 3313 EXPECT_TRUE(channel != nullptr); |
3293 delete channel; | 3314 delete channel; |
3294 } | 3315 } |
3295 } | 3316 } |
3296 | 3317 |
3297 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. | 3318 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. |
3298 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { | 3319 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { |
3299 // TODO(ossu): Why are the payload types of codecs with non-static payload | 3320 // TODO(ossu): Why are the payload types of codecs with non-static payload |
3300 // type assignments checked here? It shouldn't really matter. | 3321 // type assignments checked here? It shouldn't really matter. |
3301 cricket::WebRtcVoiceEngine engine( | 3322 cricket::WebRtcVoiceEngine engine( |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3335 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); | 3356 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); |
3336 } | 3357 } |
3337 } | 3358 } |
3338 } | 3359 } |
3339 | 3360 |
3340 // Tests that VoE supports at least 32 channels | 3361 // Tests that VoE supports at least 32 channels |
3341 TEST(WebRtcVoiceEngineTest, Has32Channels) { | 3362 TEST(WebRtcVoiceEngineTest, Has32Channels) { |
3342 cricket::WebRtcVoiceEngine engine( | 3363 cricket::WebRtcVoiceEngine engine( |
3343 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3364 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
3344 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); | 3365 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); |
3345 webrtc::RtcEventLogNullImpl event_log; | 3366 CallHelper call_helper; |
3346 std::unique_ptr<webrtc::Call> call( | |
3347 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | |
3348 | 3367 |
3349 cricket::VoiceMediaChannel* channels[32]; | 3368 cricket::VoiceMediaChannel* channels[32]; |
3350 int num_channels = 0; | 3369 int num_channels = 0; |
3351 while (num_channels < arraysize(channels)) { | 3370 while (num_channels < arraysize(channels)) { |
3352 cricket::VoiceMediaChannel* channel = engine.CreateChannel( | 3371 cricket::VoiceMediaChannel* channel = engine.CreateChannel( |
3353 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); | 3372 call_helper.call(), cricket::MediaConfig(), cricket::AudioOptions()); |
3354 if (!channel) | 3373 if (!channel) |
3355 break; | 3374 break; |
3356 channels[num_channels++] = channel; | 3375 channels[num_channels++] = channel; |
3357 } | 3376 } |
3358 | 3377 |
3359 int expected = arraysize(channels); | 3378 int expected = arraysize(channels); |
3360 EXPECT_EQ(expected, num_channels); | 3379 EXPECT_EQ(expected, num_channels); |
3361 | 3380 |
3362 while (num_channels > 0) { | 3381 while (num_channels > 0) { |
3363 delete channels[--num_channels]; | 3382 delete channels[--num_channels]; |
3364 } | 3383 } |
3365 } | 3384 } |
3366 | 3385 |
3367 // Test that we set our preferred codecs properly. | 3386 // Test that we set our preferred codecs properly. |
3368 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { | 3387 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) { |
3369 // TODO(ossu): I'm not sure of the intent of this test. It's either: | 3388 // TODO(ossu): I'm not sure of the intent of this test. It's either: |
3370 // - Check that our builtin codecs are usable by Channel. | 3389 // - Check that our builtin codecs are usable by Channel. |
3371 // - The codecs provided by the engine is usable by Channel. | 3390 // - The codecs provided by the engine is usable by Channel. |
3372 // It does not check that the codecs in the RecvParameters are actually | 3391 // It does not check that the codecs in the RecvParameters are actually |
3373 // what we sent in - though it's probably reasonable to expect so, if | 3392 // what we sent in - though it's probably reasonable to expect so, if |
3374 // SetRecvParameters returns true. | 3393 // SetRecvParameters returns true. |
3375 // I think it will become clear once audio decoder injection is completed. | 3394 // I think it will become clear once audio decoder injection is completed. |
3376 cricket::WebRtcVoiceEngine engine( | 3395 cricket::WebRtcVoiceEngine engine( |
3377 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), | 3396 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), |
3378 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr); | 3397 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr); |
3379 webrtc::RtcEventLogNullImpl event_log; | 3398 CallHelper call_helper; |
3380 std::unique_ptr<webrtc::Call> call( | |
3381 webrtc::Call::Create(webrtc::Call::Config(&event_log))); | |
3382 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), | 3399 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), |
3383 cricket::AudioOptions(), call.get()); | 3400 cricket::AudioOptions(), |
| 3401 call_helper.call()); |
3384 cricket::AudioRecvParameters parameters; | 3402 cricket::AudioRecvParameters parameters; |
3385 parameters.codecs = engine.recv_codecs(); | 3403 parameters.codecs = engine.recv_codecs(); |
3386 EXPECT_TRUE(channel.SetRecvParameters(parameters)); | 3404 EXPECT_TRUE(channel.SetRecvParameters(parameters)); |
3387 } | 3405 } |
3388 | 3406 |
3389 TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) { | 3407 TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) { |
3390 std::vector<webrtc::AudioCodecSpec> specs; | 3408 std::vector<webrtc::AudioCodecSpec> specs; |
3391 webrtc::AudioCodecSpec spec1{{"codec1", 48000, 2, {{"param1", "value1"}}}, | 3409 webrtc::AudioCodecSpec spec1{{"codec1", 48000, 2, {{"param1", "value1"}}}, |
3392 {48000, 2, 16000, 10000, 20000}}; | 3410 {48000, 2, 16000, 10000, 20000}}; |
3393 spec1.info.allow_comfort_noise = false; | 3411 spec1.info.allow_comfort_noise = false; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3454 // Without this cast, the comparison turned unsigned and, thus, failed for -1. | 3472 // Without this cast, the comparison turned unsigned and, thus, failed for -1. |
3455 const int num_specs = static_cast<int>(specs.size()); | 3473 const int num_specs = static_cast<int>(specs.size()); |
3456 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); | 3474 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); |
3457 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); | 3475 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); |
3458 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); | 3476 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); |
3459 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); | 3477 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); |
3460 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); | 3478 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); |
3461 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); | 3479 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); |
3462 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); | 3480 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); |
3463 } | 3481 } |
OLD | NEW |