128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/*
228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle
35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2004--2011 Google Inc.
428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     this list of conditions and the following disclaimer.
1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     and/or other materials provided with the distribution.
1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *     derived from this software without specific prior written permission.
1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *
1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */
2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/peerconnectionfactory.h"
2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
300eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg#include <utility>
310eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg
3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/audiotrack.h"
3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/localaudiosource.h"
34ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/mediastream.h"
3528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastreamproxy.h"
3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrackproxy.h"
3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/peerconnection.h"
3881134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org#include "talk/app/webrtc/peerconnectionfactoryproxy.h"
3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/peerconnectionproxy.h"
40967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org#include "talk/app/webrtc/videosource.h"
4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videosourceproxy.h"
4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h"
4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtcmediaengine.h"
4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtcvideodecoderfactory.h"
4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/webrtc/webrtcvideoencoderfactory.h"
463987b6de506a7e72a5bdfdf8c8ad9964705c5a28jiayl@webrtc.org#include "webrtc/base/bind.h"
4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "webrtc/modules/audio_device/include/audio_device.h"
4841b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef#include "webrtc/p2p/base/basicpacketsocketfactory.h"
4941b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef#include "webrtc/p2p/client/basicportallocator.h"
5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace webrtc {
5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
535e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boströmnamespace {
545e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström
555e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström// Passes down the calls to |store_|. See usage in CreatePeerConnection.
565e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boströmclass DtlsIdentityStoreWrapper : public DtlsIdentityStoreInterface {
575e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström public:
585e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  DtlsIdentityStoreWrapper(
595e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström      const rtc::scoped_refptr<RefCountedDtlsIdentityStore>& store)
605e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström      : store_(store) {
6191d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg    RTC_DCHECK(store_);
625e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  }
635e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström
645e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  void RequestIdentity(
655e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström      rtc::KeyType key_type,
665e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström      const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>&
675e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström          observer) override {
685e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström    store_->RequestIdentity(key_type, observer);
695e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  }
705e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström
715e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström private:
725e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  rtc::scoped_refptr<RefCountedDtlsIdentityStore> store_;
735e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström};
745e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström
755e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström}  // anonymous namespace
765e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström
77d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<PeerConnectionFactoryInterface>
7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgCreatePeerConnectionFactory() {
79d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
80d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org      new rtc::RefCountedObject<PeerConnectionFactory>());
8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
8281134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org
8381134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  // Call Initialize synchronously but make sure its executed on
8481134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  // |signaling_thread|.
8581134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  MethodCall0<PeerConnectionFactory, bool> call(
8681134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      pc_factory.get(),
8781134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      &PeerConnectionFactory::Initialize);
8881134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  bool result =  call.Marshal(pc_factory->signaling_thread());
8981134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org
9081134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  if (!result) {
9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    return NULL;
9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
9381134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  return PeerConnectionFactoryProxy::Create(pc_factory->signaling_thread(),
9481134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org                                            pc_factory);
9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
97d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<PeerConnectionFactoryInterface>
9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgCreatePeerConnectionFactory(
99d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org    rtc::Thread* worker_thread,
100d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org    rtc::Thread* signaling_thread,
10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    AudioDeviceModule* default_adm,
10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    cricket::WebRtcVideoEncoderFactory* encoder_factory,
10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    cricket::WebRtcVideoDecoderFactory* decoder_factory) {
104d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
105d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org      new rtc::RefCountedObject<PeerConnectionFactory>(worker_thread,
10681134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org                                                       signaling_thread,
10781134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org                                                       default_adm,
10881134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org                                                       encoder_factory,
10981134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org                                                       decoder_factory));
11081134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org
11181134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  // Call Initialize synchronously but make sure its executed on
11281134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  // |signaling_thread|.
11381134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  MethodCall0<PeerConnectionFactory, bool> call(
11481134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      pc_factory.get(),
11581134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      &PeerConnectionFactory::Initialize);
11681134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  bool result =  call.Marshal(signaling_thread);
11781134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org
11881134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  if (!result) {
11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    return NULL;
12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
12181134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  return PeerConnectionFactoryProxy::Create(signaling_thread, pc_factory);
12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgPeerConnectionFactory::PeerConnectionFactory()
12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    : owns_ptrs_(true),
12681134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      wraps_current_thread_(false),
12781134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      signaling_thread_(rtc::ThreadManager::Instance()->CurrentThread()),
128d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org      worker_thread_(new rtc::Thread) {
12981134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  if (!signaling_thread_) {
13081134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org    signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
13181134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org    wraps_current_thread_ = true;
13281134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  }
13381134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  worker_thread_->Start();
13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgPeerConnectionFactory::PeerConnectionFactory(
137d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org    rtc::Thread* worker_thread,
138d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org    rtc::Thread* signaling_thread,
13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    AudioDeviceModule* default_adm,
14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    cricket::WebRtcVideoDecoderFactory* video_decoder_factory)
14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    : owns_ptrs_(false),
14381134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      wraps_current_thread_(false),
14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      signaling_thread_(signaling_thread),
14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      worker_thread_(worker_thread),
14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      default_adm_(default_adm),
14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      video_encoder_factory_(video_encoder_factory),
14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      video_decoder_factory_(video_decoder_factory) {
14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  ASSERT(worker_thread != NULL);
15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  ASSERT(signaling_thread != NULL);
15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // TODO: Currently there is no way creating an external adm in
15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // libjingle source tree. So we can 't currently assert if this is NULL.
15328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // ASSERT(default_adm != NULL);
15428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
15528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
15628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgPeerConnectionFactory::~PeerConnectionFactory() {
15791d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
1585e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  channel_manager_.reset(nullptr);
159d83f4eff84d872da3e38e1a61d669fc407ce7adfjiayl@webrtc.org
160d83f4eff84d872da3e38e1a61d669fc407ce7adfjiayl@webrtc.org  // Make sure |worker_thread_| and |signaling_thread_| outlive
16141b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  // |dtls_identity_store_|, |default_socket_factory_| and
16241b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  // |default_network_manager_|.
1635e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  dtls_identity_store_ = nullptr;
16441b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  default_socket_factory_ = nullptr;
16541b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  default_network_manager_ = nullptr;
166d83f4eff84d872da3e38e1a61d669fc407ce7adfjiayl@webrtc.org
16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  if (owns_ptrs_) {
16881134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org    if (wraps_current_thread_)
16981134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org      rtc::ThreadManager::Instance()->UnwrapCurrentThread();
17029540b18795a14c3eaa3bcdbd74b46239a1d2055fischman@webrtc.org    delete worker_thread_;
17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgbool PeerConnectionFactory::Initialize() {
17591d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
176d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::InitRandom(rtc::Time());
17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
17841b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  default_network_manager_.reset(new rtc::BasicNetworkManager());
17941b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  if (!default_network_manager_) {
18041b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    return false;
18141b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  }
18241b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef
18341b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  default_socket_factory_.reset(
18441b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef      new rtc::BasicPacketSocketFactory(worker_thread_));
18541b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  if (!default_socket_factory_) {
18641b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    return false;
18741b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  }
18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // TODO:  Need to make sure only one VoE is created inside
19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // WebRtcMediaEngine.
19162f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org  cricket::MediaEngineInterface* media_engine =
19262f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org      worker_thread_->Invoke<cricket::MediaEngineInterface*>(rtc::Bind(
19362f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org      &PeerConnectionFactory::CreateMediaEngine_w, this));
19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
195facbbecb516547adc2ac684c8e0be95ad79dfd88solenberg  channel_manager_.reset(
196facbbecb516547adc2ac684c8e0be95ad79dfd88solenberg      new cricket::ChannelManager(media_engine, worker_thread_));
19762f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org
19885d2794e5b57a1501a7fdade61eccd086e7a622dstefan@webrtc.org  channel_manager_->SetVideoRtxEnabled(true);
19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  if (!channel_manager_->Init()) {
20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    return false;
20128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
20261e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org
2035e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström  dtls_identity_store_ = new RefCountedDtlsIdentityStore(
2045e56c5927e097f095aef2e9f7be49fd3d59221e1Henrik Boström      signaling_thread_, worker_thread_);
20561e00b0bcab899a32f14c1e2e0f4b7f316cc1f03jiayl@webrtc.org
20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return true;
20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
209d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<AudioSourceInterface>
21081134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.orgPeerConnectionFactory::CreateAudioSource(
21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    const MediaConstraintsInterface* constraints) {
21291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
213d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<LocalAudioSource> source(
21497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      LocalAudioSource::Create(options_, constraints));
21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return source;
21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
218d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<VideoSourceInterface>
21981134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.orgPeerConnectionFactory::CreateVideoSource(
22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    cricket::VideoCapturer* capturer,
22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    const MediaConstraintsInterface* constraints) {
22291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
2236eca7e3c371383020095ba346e1ac70f38a8c0fdtommi  rtc::scoped_refptr<VideoSource> source(VideoSource::Create(
2246eca7e3c371383020095ba346e1ac70f38a8c0fdtommi      channel_manager_.get(), capturer, constraints, false));
22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return VideoSourceProxy::Create(signaling_thread_, source);
22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
228a4df27b6713583045e51e20c4eb93718d15ca33eivocbool PeerConnectionFactory::StartAecDump(rtc::PlatformFile file) {
22991d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
230a4df27b6713583045e51e20c4eb93718d15ca33eivoc  return channel_manager_->StartAecDump(file);
231a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org}
232a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org
233797ef123249f793655640e8cb6ff1eb4fe7e3223ivocvoid PeerConnectionFactory::StopAecDump() {
234797ef123249f793655640e8cb6ff1eb4fe7e3223ivoc  RTC_DCHECK(signaling_thread_->IsCurrent());
235797ef123249f793655640e8cb6ff1eb4fe7e3223ivoc  channel_manager_->StopAecDump();
236797ef123249f793655640e8cb6ff1eb4fe7e3223ivoc}
237797ef123249f793655640e8cb6ff1eb4fe7e3223ivoc
238112a3d81db02d349af0ce6c0827da6d8fbc421a8ivocbool PeerConnectionFactory::StartRtcEventLog(rtc::PlatformFile file) {
239112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc  RTC_DCHECK(signaling_thread_->IsCurrent());
240112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc  return channel_manager_->StartRtcEventLog(file);
241112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc}
242112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc
243112a3d81db02d349af0ce6c0827da6d8fbc421a8ivocvoid PeerConnectionFactory::StopRtcEventLog() {
244112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc  RTC_DCHECK(signaling_thread_->IsCurrent());
245112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc  channel_manager_->StopRtcEventLog();
246112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc}
247112a3d81db02d349af0ce6c0827da6d8fbc421a8ivoc
248d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<PeerConnectionInterface>
24928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgPeerConnectionFactory::CreatePeerConnection(
25041451d4e55e9cc00c342d0ad64dcf891cfb24622buildbot@webrtc.org    const PeerConnectionInterface::RTCConfiguration& configuration,
25128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    const MediaConstraintsInterface* constraints,
25241b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    rtc::scoped_ptr<cricket::PortAllocator> allocator,
25341b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store,
25441b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    PeerConnectionObserver* observer) {
25541b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  RTC_DCHECK(signaling_thread_->IsCurrent());
25641b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef
25741b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  if (!dtls_identity_store.get()) {
25841b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    // Because |pc|->Initialize takes ownership of the store we need a new
25941b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    // wrapper object that can be deleted without deleting the underlying
26041b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    // |dtls_identity_store_|, protecting it from being deleted multiple times.
26141b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    dtls_identity_store.reset(
26241b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef        new DtlsIdentityStoreWrapper(dtls_identity_store_));
26341b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  }
26441b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef
26541b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  if (!allocator) {
26641b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    allocator.reset(new cricket::BasicPortAllocator(
26741b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef        default_network_manager_.get(), default_socket_factory_.get()));
26841b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  }
2690c7e9f540b282d60b94081f601a1694054d8646eTaylor Brandstetter  allocator->SetNetworkIgnoreMask(options_.network_ignore_mask);
27041b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef
27141b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  rtc::scoped_refptr<PeerConnection> pc(
27241b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef      new rtc::RefCountedObject<PeerConnection>(this));
27341b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  if (!pc->Initialize(configuration, constraints, std::move(allocator),
27441b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef                      std::move(dtls_identity_store), observer)) {
27541b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef    return nullptr;
27641b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  }
27741b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef  return PeerConnectionProxy::Create(signaling_thread(), pc);
27841b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef}
27941b0798e1171a105404f6bc9dcb591cdc77d659fdeadbeef
280d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<MediaStreamInterface>
28128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgPeerConnectionFactory::CreateLocalMediaStream(const std::string& label) {
28291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
28328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return MediaStreamProxy::Create(signaling_thread_,
28428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                  MediaStream::Create(label));
28528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
28628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
287d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<VideoTrackInterface>
28828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgPeerConnectionFactory::CreateVideoTrack(
28928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    const std::string& id,
29028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    VideoSourceInterface* source) {
29191d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
292d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::scoped_refptr<VideoTrackInterface> track(
29328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      VideoTrack::Create(id, source));
29428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return VideoTrackProxy::Create(signaling_thread_, track);
29528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
29628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
297d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::scoped_refptr<AudioTrackInterface>
298b5a22b14648c53874b4b76368a1a2271d985e875pbos@webrtc.orgPeerConnectionFactory::CreateAudioTrack(const std::string& id,
299b5a22b14648c53874b4b76368a1a2271d985e875pbos@webrtc.org                                        AudioSourceInterface* source) {
30091d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
3016eca7e3c371383020095ba346e1ac70f38a8c0fdtommi  rtc::scoped_refptr<AudioTrackInterface> track(AudioTrack::Create(id, source));
30228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return AudioTrackProxy::Create(signaling_thread_, track);
30328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
30428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
305c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefanwebrtc::MediaControllerInterface* PeerConnectionFactory::CreateMediaController()
306c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan    const {
30791d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
308c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan  return MediaControllerInterface::Create(worker_thread_,
309c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan                                          channel_manager_.get());
31028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
31128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
312d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::Thread* PeerConnectionFactory::signaling_thread() {
31381134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  // This method can be called on a different thread when the factory is
31481134d019d1e3a9f7bfb4dc51d90e66e8d06b27dperkj@webrtc.org  // created in CreatePeerConnectionFactory().
31528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return signaling_thread_;
31628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
31728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
318d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.orgrtc::Thread* PeerConnectionFactory::worker_thread() {
31991d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(signaling_thread_->IsCurrent());
32028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return worker_thread_;
32128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
32228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
32362f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.orgcricket::MediaEngineInterface* PeerConnectionFactory::CreateMediaEngine_w() {
32462f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org  ASSERT(worker_thread_ == rtc::Thread::Current());
32562f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org  return cricket::WebRtcMediaEngineFactory::Create(
326ccb49e79fd4c439a30b9a999eab4ef329ba8425cFredrik Solenberg      default_adm_.get(), video_encoder_factory_.get(),
32762f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org      video_decoder_factory_.get());
32862f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org}
32962f6e756730325ee7b20cf5f81e82b0a70283a05henrika@webrtc.org
33028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}  // namespace webrtc
331