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