blob: 6d36c8bc2fcf5bcc60956c351ffc31ec8d3f67fd [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
2 * libjingle
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 * Copyright 2004--2011 Google Inc.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00004 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "talk/app/webrtc/peerconnectionfactory.h"
29
kwiberg0eb15ed2015-12-17 03:04:15 -080030#include <utility>
31
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/app/webrtc/audiotrack.h"
33#include "talk/app/webrtc/localaudiosource.h"
deadbeefab9b2d12015-10-14 11:33:11 -070034#include "talk/app/webrtc/mediastream.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/app/webrtc/mediastreamproxy.h"
36#include "talk/app/webrtc/mediastreamtrackproxy.h"
37#include "talk/app/webrtc/peerconnection.h"
perkj@webrtc.org81134d02015-01-12 08:30:16 +000038#include "talk/app/webrtc/peerconnectionfactoryproxy.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/app/webrtc/peerconnectionproxy.h"
40#include "talk/app/webrtc/portallocatorfactory.h"
wu@webrtc.org967bfff2013-09-19 05:49:50 +000041#include "talk/app/webrtc/videosource.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042#include "talk/app/webrtc/videosourceproxy.h"
43#include "talk/app/webrtc/videotrack.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044#include "talk/media/webrtc/webrtcmediaengine.h"
45#include "talk/media/webrtc/webrtcvideodecoderfactory.h"
46#include "talk/media/webrtc/webrtcvideoencoderfactory.h"
jiayl@webrtc.org3987b6d2014-09-24 17:14:05 +000047#include "webrtc/base/bind.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048#include "webrtc/modules/audio_device/include/audio_device.h"
deadbeef41b07982015-12-01 15:01:24 -080049#include "webrtc/p2p/base/basicpacketsocketfactory.h"
50#include "webrtc/p2p/client/basicportallocator.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052namespace webrtc {
53
Henrik Boström5e56c592015-08-11 10:33:13 +020054namespace {
55
56// Passes down the calls to |store_|. See usage in CreatePeerConnection.
57class DtlsIdentityStoreWrapper : public DtlsIdentityStoreInterface {
58 public:
59 DtlsIdentityStoreWrapper(
60 const rtc::scoped_refptr<RefCountedDtlsIdentityStore>& store)
61 : store_(store) {
henrikg91d6ede2015-09-17 00:24:34 -070062 RTC_DCHECK(store_);
Henrik Boström5e56c592015-08-11 10:33:13 +020063 }
64
65 void RequestIdentity(
66 rtc::KeyType key_type,
67 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>&
68 observer) override {
69 store_->RequestIdentity(key_type, observer);
70 }
71
72 private:
73 rtc::scoped_refptr<RefCountedDtlsIdentityStore> store_;
74};
75
76} // anonymous namespace
77
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000078rtc::scoped_refptr<PeerConnectionFactoryInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079CreatePeerConnectionFactory() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000080 rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
81 new rtc::RefCountedObject<PeerConnectionFactory>());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082
perkj@webrtc.org81134d02015-01-12 08:30:16 +000083
84 // Call Initialize synchronously but make sure its executed on
85 // |signaling_thread|.
86 MethodCall0<PeerConnectionFactory, bool> call(
87 pc_factory.get(),
88 &PeerConnectionFactory::Initialize);
89 bool result = call.Marshal(pc_factory->signaling_thread());
90
91 if (!result) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 return NULL;
93 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +000094 return PeerConnectionFactoryProxy::Create(pc_factory->signaling_thread(),
95 pc_factory);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096}
97
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000098rtc::scoped_refptr<PeerConnectionFactoryInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099CreatePeerConnectionFactory(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000100 rtc::Thread* worker_thread,
101 rtc::Thread* signaling_thread,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 AudioDeviceModule* default_adm,
103 cricket::WebRtcVideoEncoderFactory* encoder_factory,
104 cricket::WebRtcVideoDecoderFactory* decoder_factory) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000105 rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
106 new rtc::RefCountedObject<PeerConnectionFactory>(worker_thread,
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000107 signaling_thread,
108 default_adm,
109 encoder_factory,
110 decoder_factory));
111
112 // Call Initialize synchronously but make sure its executed on
113 // |signaling_thread|.
114 MethodCall0<PeerConnectionFactory, bool> call(
115 pc_factory.get(),
116 &PeerConnectionFactory::Initialize);
117 bool result = call.Marshal(signaling_thread);
118
119 if (!result) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 return NULL;
121 }
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000122 return PeerConnectionFactoryProxy::Create(signaling_thread, pc_factory);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123}
124
125PeerConnectionFactory::PeerConnectionFactory()
126 : owns_ptrs_(true),
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000127 wraps_current_thread_(false),
128 signaling_thread_(rtc::ThreadManager::Instance()->CurrentThread()),
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000129 worker_thread_(new rtc::Thread) {
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000130 if (!signaling_thread_) {
131 signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
132 wraps_current_thread_ = true;
133 }
134 worker_thread_->Start();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135}
136
137PeerConnectionFactory::PeerConnectionFactory(
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000138 rtc::Thread* worker_thread,
139 rtc::Thread* signaling_thread,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 AudioDeviceModule* default_adm,
141 cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
142 cricket::WebRtcVideoDecoderFactory* video_decoder_factory)
143 : owns_ptrs_(false),
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000144 wraps_current_thread_(false),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 signaling_thread_(signaling_thread),
146 worker_thread_(worker_thread),
147 default_adm_(default_adm),
148 video_encoder_factory_(video_encoder_factory),
149 video_decoder_factory_(video_decoder_factory) {
150 ASSERT(worker_thread != NULL);
151 ASSERT(signaling_thread != NULL);
152 // TODO: Currently there is no way creating an external adm in
153 // libjingle source tree. So we can 't currently assert if this is NULL.
154 // ASSERT(default_adm != NULL);
155}
156
157PeerConnectionFactory::~PeerConnectionFactory() {
henrikg91d6ede2015-09-17 00:24:34 -0700158 RTC_DCHECK(signaling_thread_->IsCurrent());
Henrik Boström5e56c592015-08-11 10:33:13 +0200159 channel_manager_.reset(nullptr);
160 default_allocator_factory_ = nullptr;
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000161
162 // Make sure |worker_thread_| and |signaling_thread_| outlive
deadbeef41b07982015-12-01 15:01:24 -0800163 // |dtls_identity_store_|, |default_socket_factory_| and
164 // |default_network_manager_|.
Henrik Boström5e56c592015-08-11 10:33:13 +0200165 dtls_identity_store_ = nullptr;
deadbeef41b07982015-12-01 15:01:24 -0800166 default_socket_factory_ = nullptr;
167 default_network_manager_ = nullptr;
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000168
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169 if (owns_ptrs_) {
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000170 if (wraps_current_thread_)
171 rtc::ThreadManager::Instance()->UnwrapCurrentThread();
fischman@webrtc.org29540b12014-04-17 22:54:30 +0000172 delete worker_thread_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000173 }
174}
175
176bool PeerConnectionFactory::Initialize() {
henrikg91d6ede2015-09-17 00:24:34 -0700177 RTC_DCHECK(signaling_thread_->IsCurrent());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000178 rtc::InitRandom(rtc::Time());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000180 default_allocator_factory_ = PortAllocatorFactory::Create(worker_thread_);
deadbeef41b07982015-12-01 15:01:24 -0800181 if (!default_allocator_factory_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000182 return false;
deadbeef41b07982015-12-01 15:01:24 -0800183 }
184
185 default_network_manager_.reset(new rtc::BasicNetworkManager());
186 if (!default_network_manager_) {
187 return false;
188 }
189
190 default_socket_factory_.reset(
191 new rtc::BasicPacketSocketFactory(worker_thread_));
192 if (!default_socket_factory_) {
193 return false;
194 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000196 // TODO: Need to make sure only one VoE is created inside
197 // WebRtcMediaEngine.
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000198 cricket::MediaEngineInterface* media_engine =
199 worker_thread_->Invoke<cricket::MediaEngineInterface*>(rtc::Bind(
200 &PeerConnectionFactory::CreateMediaEngine_w, this));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201
solenbergfacbbec2015-09-24 00:41:50 -0700202 channel_manager_.reset(
203 new cricket::ChannelManager(media_engine, worker_thread_));
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000204
stefan@webrtc.org85d27942014-06-09 12:51:39 +0000205 channel_manager_->SetVideoRtxEnabled(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000206 if (!channel_manager_->Init()) {
207 return false;
208 }
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +0000209
Henrik Boström5e56c592015-08-11 10:33:13 +0200210 dtls_identity_store_ = new RefCountedDtlsIdentityStore(
211 signaling_thread_, worker_thread_);
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +0000212
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 return true;
214}
215
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000216rtc::scoped_refptr<AudioSourceInterface>
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000217PeerConnectionFactory::CreateAudioSource(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000218 const MediaConstraintsInterface* constraints) {
henrikg91d6ede2015-09-17 00:24:34 -0700219 RTC_DCHECK(signaling_thread_->IsCurrent());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000220 rtc::scoped_refptr<LocalAudioSource> source(
wu@webrtc.org97077a32013-10-25 21:18:33 +0000221 LocalAudioSource::Create(options_, constraints));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 return source;
223}
224
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000225rtc::scoped_refptr<VideoSourceInterface>
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000226PeerConnectionFactory::CreateVideoSource(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000227 cricket::VideoCapturer* capturer,
228 const MediaConstraintsInterface* constraints) {
henrikg91d6ede2015-09-17 00:24:34 -0700229 RTC_DCHECK(signaling_thread_->IsCurrent());
tommi6eca7e32015-12-15 04:27:11 -0800230 rtc::scoped_refptr<VideoSource> source(VideoSource::Create(
231 channel_manager_.get(), capturer, constraints, false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 return VideoSourceProxy::Create(signaling_thread_, source);
233}
234
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000235bool PeerConnectionFactory::StartAecDump(rtc::PlatformFile file) {
henrikg91d6ede2015-09-17 00:24:34 -0700236 RTC_DCHECK(signaling_thread_->IsCurrent());
wu@webrtc.orga9890802013-12-13 00:21:03 +0000237 return channel_manager_->StartAecDump(file);
238}
239
ivoc797ef122015-10-22 03:25:41 -0700240void PeerConnectionFactory::StopAecDump() {
241 RTC_DCHECK(signaling_thread_->IsCurrent());
242 channel_manager_->StopAecDump();
243}
244
ivoc112a3d82015-10-16 02:22:18 -0700245bool PeerConnectionFactory::StartRtcEventLog(rtc::PlatformFile file) {
246 RTC_DCHECK(signaling_thread_->IsCurrent());
247 return channel_manager_->StartRtcEventLog(file);
248}
249
250void PeerConnectionFactory::StopRtcEventLog() {
251 RTC_DCHECK(signaling_thread_->IsCurrent());
252 channel_manager_->StopRtcEventLog();
253}
254
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000255rtc::scoped_refptr<PeerConnectionInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000256PeerConnectionFactory::CreatePeerConnection(
buildbot@webrtc.org41451d42014-05-03 05:39:45 +0000257 const PeerConnectionInterface::RTCConfiguration& configuration,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000258 const MediaConstraintsInterface* constraints,
259 PortAllocatorFactoryInterface* allocator_factory,
Henrik Boström5e56c592015-08-11 10:33:13 +0200260 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261 PeerConnectionObserver* observer) {
henrikg91d6ede2015-09-17 00:24:34 -0700262 RTC_DCHECK(signaling_thread_->IsCurrent());
263 RTC_DCHECK(allocator_factory || default_allocator_factory_);
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000264
Henrik Boström5e56c592015-08-11 10:33:13 +0200265 if (!dtls_identity_store.get()) {
266 // Because |pc|->Initialize takes ownership of the store we need a new
267 // wrapper object that can be deleted without deleting the underlying
268 // |dtls_identity_store_|, protecting it from being deleted multiple times.
269 dtls_identity_store.reset(
270 new DtlsIdentityStoreWrapper(dtls_identity_store_));
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +0000271 }
272
phoglund@webrtc.org006521d2015-02-12 09:23:59 +0000273 PortAllocatorFactoryInterface* chosen_allocator_factory =
274 allocator_factory ? allocator_factory : default_allocator_factory_.get();
275 chosen_allocator_factory->SetNetworkIgnoreMask(options_.network_ignore_mask);
276
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000277 rtc::scoped_refptr<PeerConnection> pc(
278 new rtc::RefCountedObject<PeerConnection>(this));
kwiberg0eb15ed2015-12-17 03:04:15 -0800279 if (!pc->Initialize(configuration, constraints, chosen_allocator_factory,
280 std::move(dtls_identity_store), observer)) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000281 return NULL;
282 }
283 return PeerConnectionProxy::Create(signaling_thread(), pc);
284}
285
deadbeef41b07982015-12-01 15:01:24 -0800286rtc::scoped_refptr<PeerConnectionInterface>
287PeerConnectionFactory::CreatePeerConnection(
288 const PeerConnectionInterface::RTCConfiguration& configuration,
289 const MediaConstraintsInterface* constraints,
290 rtc::scoped_ptr<cricket::PortAllocator> allocator,
291 rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
292 PeerConnectionObserver* observer) {
293 RTC_DCHECK(signaling_thread_->IsCurrent());
294
295 if (!dtls_identity_store.get()) {
296 // Because |pc|->Initialize takes ownership of the store we need a new
297 // wrapper object that can be deleted without deleting the underlying
298 // |dtls_identity_store_|, protecting it from being deleted multiple times.
299 dtls_identity_store.reset(
300 new DtlsIdentityStoreWrapper(dtls_identity_store_));
301 }
302
303 if (!allocator) {
304 allocator.reset(new cricket::BasicPortAllocator(
305 default_network_manager_.get(), default_socket_factory_.get()));
306 }
307 default_network_manager_->set_network_ignore_mask(
308 options_.network_ignore_mask);
309
310 rtc::scoped_refptr<PeerConnection> pc(
311 new rtc::RefCountedObject<PeerConnection>(this));
312 if (!pc->Initialize(configuration, constraints, std::move(allocator),
313 std::move(dtls_identity_store), observer)) {
314 return nullptr;
315 }
316 return PeerConnectionProxy::Create(signaling_thread(), pc);
317}
318
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000319rtc::scoped_refptr<MediaStreamInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320PeerConnectionFactory::CreateLocalMediaStream(const std::string& label) {
henrikg91d6ede2015-09-17 00:24:34 -0700321 RTC_DCHECK(signaling_thread_->IsCurrent());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000322 return MediaStreamProxy::Create(signaling_thread_,
323 MediaStream::Create(label));
324}
325
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000326rtc::scoped_refptr<VideoTrackInterface>
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000327PeerConnectionFactory::CreateVideoTrack(
328 const std::string& id,
329 VideoSourceInterface* source) {
henrikg91d6ede2015-09-17 00:24:34 -0700330 RTC_DCHECK(signaling_thread_->IsCurrent());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000331 rtc::scoped_refptr<VideoTrackInterface> track(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 VideoTrack::Create(id, source));
333 return VideoTrackProxy::Create(signaling_thread_, track);
334}
335
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000336rtc::scoped_refptr<AudioTrackInterface>
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000337PeerConnectionFactory::CreateAudioTrack(const std::string& id,
338 AudioSourceInterface* source) {
henrikg91d6ede2015-09-17 00:24:34 -0700339 RTC_DCHECK(signaling_thread_->IsCurrent());
tommi6eca7e32015-12-15 04:27:11 -0800340 rtc::scoped_refptr<AudioTrackInterface> track(AudioTrack::Create(id, source));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 return AudioTrackProxy::Create(signaling_thread_, track);
342}
343
stefanc1aeaf02015-10-15 07:26:07 -0700344webrtc::MediaControllerInterface* PeerConnectionFactory::CreateMediaController()
345 const {
henrikg91d6ede2015-09-17 00:24:34 -0700346 RTC_DCHECK(signaling_thread_->IsCurrent());
stefanc1aeaf02015-10-15 07:26:07 -0700347 return MediaControllerInterface::Create(worker_thread_,
348 channel_manager_.get());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349}
350
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000351rtc::Thread* PeerConnectionFactory::signaling_thread() {
perkj@webrtc.org81134d02015-01-12 08:30:16 +0000352 // This method can be called on a different thread when the factory is
353 // created in CreatePeerConnectionFactory().
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000354 return signaling_thread_;
355}
356
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000357rtc::Thread* PeerConnectionFactory::worker_thread() {
henrikg91d6ede2015-09-17 00:24:34 -0700358 RTC_DCHECK(signaling_thread_->IsCurrent());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359 return worker_thread_;
360}
361
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000362cricket::MediaEngineInterface* PeerConnectionFactory::CreateMediaEngine_w() {
363 ASSERT(worker_thread_ == rtc::Thread::Current());
364 return cricket::WebRtcMediaEngineFactory::Create(
Fredrik Solenbergccb49e72015-05-19 11:37:56 +0200365 default_adm_.get(), video_encoder_factory_.get(),
henrika@webrtc.org62f6e752015-02-11 08:38:35 +0000366 video_decoder_factory_.get());
367}
368
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369} // namespace webrtc