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

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

Issue 2934103002: Allow WebRtcMediaEngine to be created from any thread. (Closed)
Patch Set: Adding DCHECK for encoder_factory Created 3 years, 6 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
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine.cc ('k') | webrtc/pc/peerconnectionfactory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 EXPECT_CALL(apm, DetachAecDump()); 128 EXPECT_CALL(apm, DetachAecDump());
129 StrictMock<MockTransmitMixer> transmit_mixer; 129 StrictMock<MockTransmitMixer> transmit_mixer;
130 EXPECT_CALL(transmit_mixer, EnableStereoChannelSwapping(false)); 130 EXPECT_CALL(transmit_mixer, EnableStereoChannelSwapping(false));
131 cricket::FakeWebRtcVoiceEngine voe(&apm, &transmit_mixer); 131 cricket::FakeWebRtcVoiceEngine voe(&apm, &transmit_mixer);
132 EXPECT_FALSE(voe.IsInited()); 132 EXPECT_FALSE(voe.IsInited());
133 { 133 {
134 cricket::WebRtcVoiceEngine engine( 134 cricket::WebRtcVoiceEngine engine(
135 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), 135 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
136 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, 136 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr,
137 new FakeVoEWrapper(&voe)); 137 new FakeVoEWrapper(&voe));
138 engine.Init();
138 EXPECT_TRUE(voe.IsInited()); 139 EXPECT_TRUE(voe.IsInited());
139 } 140 }
140 EXPECT_FALSE(voe.IsInited()); 141 EXPECT_FALSE(voe.IsInited());
141 } 142 }
142 143
143 class FakeAudioSink : public webrtc::AudioSinkInterface { 144 class FakeAudioSink : public webrtc::AudioSinkInterface {
144 public: 145 public:
145 void OnData(const Data& audio) override {} 146 void OnData(const Data& audio) override {}
146 }; 147 };
147 148
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 EXPECT_CALL(apm_gc_, set_compression_gain_db(5)).WillRepeatedly(Return(0)); 181 EXPECT_CALL(apm_gc_, set_compression_gain_db(5)).WillRepeatedly(Return(0));
181 EXPECT_CALL(apm_gc_, enable_limiter(true)).WillRepeatedly(Return(0)); 182 EXPECT_CALL(apm_gc_, enable_limiter(true)).WillRepeatedly(Return(0));
182 // TODO(kwiberg): We should use mock factories here, but a bunch of 183 // TODO(kwiberg): We should use mock factories here, but a bunch of
183 // the tests here probe the specific set of codecs provided by the builtin 184 // the tests here probe the specific set of codecs provided by the builtin
184 // factories. Those tests should probably be moved elsewhere. 185 // factories. Those tests should probably be moved elsewhere.
185 auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory(); 186 auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
186 auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory(); 187 auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory();
187 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, encoder_factory, 188 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, encoder_factory,
188 decoder_factory, nullptr, 189 decoder_factory, nullptr,
189 new FakeVoEWrapper(&voe_))); 190 new FakeVoEWrapper(&voe_)));
191 engine_->Init();
190 send_parameters_.codecs.push_back(kPcmuCodec); 192 send_parameters_.codecs.push_back(kPcmuCodec);
191 recv_parameters_.codecs.push_back(kPcmuCodec); 193 recv_parameters_.codecs.push_back(kPcmuCodec);
192 // Default Options. 194 // Default Options.
193 EXPECT_TRUE(IsHighPassFilterEnabled()); 195 EXPECT_TRUE(IsHighPassFilterEnabled());
194 } 196 }
195 197
196 bool SetupChannel() { 198 bool SetupChannel() {
197 EXPECT_CALL(apm_, ApplyConfig(testing::_)); 199 EXPECT_CALL(apm_, ApplyConfig(testing::_));
198 EXPECT_CALL(apm_, SetExtraOptions(testing::_)); 200 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
199 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(), 201 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
(...skipping 3056 matching lines...) Expand 10 before | Expand all | Expand 10 after
3256 EXPECT_TRUE(GetRecvStream(kSsrcX).started()); 3258 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
3257 } 3259 }
3258 3260
3259 // Tests that the library initializes and shuts down properly. 3261 // Tests that the library initializes and shuts down properly.
3260 TEST(WebRtcVoiceEngineTest, StartupShutdown) { 3262 TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3261 // If the VoiceEngine wants to gather available codecs early, that's fine but 3263 // 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. 3264 // we never want it to create a decoder at this stage.
3263 cricket::WebRtcVoiceEngine engine( 3265 cricket::WebRtcVoiceEngine engine(
3264 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), 3266 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3265 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); 3267 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
3268 engine.Init();
3266 webrtc::RtcEventLogNullImpl event_log; 3269 webrtc::RtcEventLogNullImpl event_log;
3267 std::unique_ptr<webrtc::Call> call( 3270 std::unique_ptr<webrtc::Call> call(
3268 webrtc::Call::Create(webrtc::Call::Config(&event_log))); 3271 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
3269 cricket::VoiceMediaChannel* channel = engine.CreateChannel( 3272 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3270 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); 3273 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3271 EXPECT_TRUE(channel != nullptr); 3274 EXPECT_TRUE(channel != nullptr);
3272 delete channel; 3275 delete channel;
3273 } 3276 }
3274 3277
3275 // Tests that reference counting on the external ADM is correct. 3278 // Tests that reference counting on the external ADM is correct.
3276 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) { 3279 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3277 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm; 3280 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3278 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0)); 3281 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3279 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0)); 3282 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
3280 // Return 100ms just in case this function gets called. If we don't, 3283 // 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. 3284 // we could enter a tight loop since the mock would return 0.
3282 EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100)); 3285 EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100));
3283 { 3286 {
3284 cricket::WebRtcVoiceEngine engine( 3287 cricket::WebRtcVoiceEngine engine(
3285 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), 3288 &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3286 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); 3289 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
3290 engine.Init();
3287 webrtc::RtcEventLogNullImpl event_log; 3291 webrtc::RtcEventLogNullImpl event_log;
3288 std::unique_ptr<webrtc::Call> call( 3292 std::unique_ptr<webrtc::Call> call(
3289 webrtc::Call::Create(webrtc::Call::Config(&event_log))); 3293 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
3290 cricket::VoiceMediaChannel* channel = engine.CreateChannel( 3294 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3291 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); 3295 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3292 EXPECT_TRUE(channel != nullptr); 3296 EXPECT_TRUE(channel != nullptr);
3293 delete channel; 3297 delete channel;
3294 } 3298 }
3295 } 3299 }
3296 3300
3297 // Verify the payload id of common audio codecs, including CN, ISAC, and G722. 3301 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3298 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) { 3302 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) {
3299 // TODO(ossu): Why are the payload types of codecs with non-static payload 3303 // TODO(ossu): Why are the payload types of codecs with non-static payload
3300 // type assignments checked here? It shouldn't really matter. 3304 // type assignments checked here? It shouldn't really matter.
3301 cricket::WebRtcVoiceEngine engine( 3305 cricket::WebRtcVoiceEngine engine(
3302 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), 3306 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3303 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); 3307 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
3308 engine.Init();
3304 for (const cricket::AudioCodec& codec : engine.send_codecs()) { 3309 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3305 auto is_codec = [&codec](const char* name, int clockrate = 0) { 3310 auto is_codec = [&codec](const char* name, int clockrate = 0) {
3306 return STR_CASE_CMP(codec.name.c_str(), name) == 0 && 3311 return STR_CASE_CMP(codec.name.c_str(), name) == 0 &&
3307 (clockrate == 0 || codec.clockrate == clockrate); 3312 (clockrate == 0 || codec.clockrate == clockrate);
3308 }; 3313 };
3309 if (is_codec("CN", 16000)) { 3314 if (is_codec("CN", 16000)) {
3310 EXPECT_EQ(105, codec.id); 3315 EXPECT_EQ(105, codec.id);
3311 } else if (is_codec("CN", 32000)) { 3316 } else if (is_codec("CN", 32000)) {
3312 EXPECT_EQ(106, codec.id); 3317 EXPECT_EQ(106, codec.id);
3313 } else if (is_codec("ISAC", 16000)) { 3318 } else if (is_codec("ISAC", 16000)) {
(...skipping 21 matching lines...) Expand all
3335 EXPECT_EQ("1", codec.params.find("useinbandfec")->second); 3340 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
3336 } 3341 }
3337 } 3342 }
3338 } 3343 }
3339 3344
3340 // Tests that VoE supports at least 32 channels 3345 // Tests that VoE supports at least 32 channels
3341 TEST(WebRtcVoiceEngineTest, Has32Channels) { 3346 TEST(WebRtcVoiceEngineTest, Has32Channels) {
3342 cricket::WebRtcVoiceEngine engine( 3347 cricket::WebRtcVoiceEngine engine(
3343 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), 3348 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3344 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr); 3349 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
3350 engine.Init();
3345 webrtc::RtcEventLogNullImpl event_log; 3351 webrtc::RtcEventLogNullImpl event_log;
3346 std::unique_ptr<webrtc::Call> call( 3352 std::unique_ptr<webrtc::Call> call(
3347 webrtc::Call::Create(webrtc::Call::Config(&event_log))); 3353 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
3348 3354
3349 cricket::VoiceMediaChannel* channels[32]; 3355 cricket::VoiceMediaChannel* channels[32];
3350 int num_channels = 0; 3356 int num_channels = 0;
3351 while (num_channels < arraysize(channels)) { 3357 while (num_channels < arraysize(channels)) {
3352 cricket::VoiceMediaChannel* channel = engine.CreateChannel( 3358 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3353 call.get(), cricket::MediaConfig(), cricket::AudioOptions()); 3359 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3354 if (!channel) 3360 if (!channel)
(...skipping 14 matching lines...) Expand all
3369 // TODO(ossu): I'm not sure of the intent of this test. It's either: 3375 // 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. 3376 // - Check that our builtin codecs are usable by Channel.
3371 // - The codecs provided by the engine is usable by Channel. 3377 // - The codecs provided by the engine is usable by Channel.
3372 // It does not check that the codecs in the RecvParameters are actually 3378 // 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 3379 // what we sent in - though it's probably reasonable to expect so, if
3374 // SetRecvParameters returns true. 3380 // SetRecvParameters returns true.
3375 // I think it will become clear once audio decoder injection is completed. 3381 // I think it will become clear once audio decoder injection is completed.
3376 cricket::WebRtcVoiceEngine engine( 3382 cricket::WebRtcVoiceEngine engine(
3377 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), 3383 nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3378 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr); 3384 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr);
3385 engine.Init();
3379 webrtc::RtcEventLogNullImpl event_log; 3386 webrtc::RtcEventLogNullImpl event_log;
3380 std::unique_ptr<webrtc::Call> call( 3387 std::unique_ptr<webrtc::Call> call(
3381 webrtc::Call::Create(webrtc::Call::Config(&event_log))); 3388 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
3382 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(), 3389 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3383 cricket::AudioOptions(), call.get()); 3390 cricket::AudioOptions(), call.get());
3384 cricket::AudioRecvParameters parameters; 3391 cricket::AudioRecvParameters parameters;
3385 parameters.codecs = engine.recv_codecs(); 3392 parameters.codecs = engine.recv_codecs();
3386 EXPECT_TRUE(channel.SetRecvParameters(parameters)); 3393 EXPECT_TRUE(channel.SetRecvParameters(parameters));
3387 } 3394 }
3388 3395
(...skipping 17 matching lines...) Expand all
3406 3413
3407 rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory = 3414 rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory =
3408 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(); 3415 webrtc::MockAudioEncoderFactory::CreateUnusedFactory();
3409 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory = 3416 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory =
3410 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>; 3417 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3411 EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders()) 3418 EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders())
3412 .WillOnce(Return(specs)); 3419 .WillOnce(Return(specs));
3413 3420
3414 cricket::WebRtcVoiceEngine engine(nullptr, unused_encoder_factory, 3421 cricket::WebRtcVoiceEngine engine(nullptr, unused_encoder_factory,
3415 mock_decoder_factory, nullptr); 3422 mock_decoder_factory, nullptr);
3423 engine.Init();
3416 auto codecs = engine.recv_codecs(); 3424 auto codecs = engine.recv_codecs();
3417 EXPECT_EQ(11, codecs.size()); 3425 EXPECT_EQ(11, codecs.size());
3418 3426
3419 // Rather than just ASSERTing that there are enough codecs, ensure that we can 3427 // Rather than just ASSERTing that there are enough codecs, ensure that we can
3420 // check the actual values safely, to provide better test results. 3428 // check the actual values safely, to provide better test results.
3421 auto get_codec = 3429 auto get_codec =
3422 [&codecs](size_t index) -> const cricket::AudioCodec& { 3430 [&codecs](size_t index) -> const cricket::AudioCodec& {
3423 static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0); 3431 static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0);
3424 if (codecs.size() > index) 3432 if (codecs.size() > index)
3425 return codecs[index]; 3433 return codecs[index];
(...skipping 28 matching lines...) Expand all
3454 // Without this cast, the comparison turned unsigned and, thus, failed for -1. 3462 // Without this cast, the comparison turned unsigned and, thus, failed for -1.
3455 const int num_specs = static_cast<int>(specs.size()); 3463 const int num_specs = static_cast<int>(specs.size());
3456 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs); 3464 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs);
3457 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs); 3465 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs);
3458 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1); 3466 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1);
3459 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs); 3467 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs);
3460 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs); 3468 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs);
3461 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs); 3469 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs);
3462 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs); 3470 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs);
3463 } 3471 }
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine.cc ('k') | webrtc/pc/peerconnectionfactory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698