1/* 2 * libjingle 3 * Copyright 2013 Google Inc. 4 * 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#if !defined(__has_feature) || !__has_feature(objc_arc) 29#error "This file requires ARC support." 30#endif 31 32#import "RTCPeerConnectionFactory+Internal.h" 33 34#include <vector> 35 36#import "RTCAudioTrack+Internal.h" 37#import "RTCICEServer+Internal.h" 38#import "RTCMediaConstraints+Internal.h" 39#import "RTCMediaSource+Internal.h" 40#import "RTCMediaStream+Internal.h" 41#import "RTCMediaStreamTrack+Internal.h" 42#import "RTCPeerConnection+Internal.h" 43#import "RTCPeerConnectionDelegate.h" 44#import "RTCPeerConnectionInterface+Internal.h" 45#import "RTCVideoCapturer+Internal.h" 46#import "RTCVideoSource+Internal.h" 47#import "RTCVideoTrack+Internal.h" 48 49#include "talk/app/webrtc/audiotrack.h" 50#include "talk/app/webrtc/mediastreaminterface.h" 51#include "talk/app/webrtc/peerconnectioninterface.h" 52#include "talk/app/webrtc/videosourceinterface.h" 53#include "talk/app/webrtc/videotrack.h" 54#include "webrtc/base/logging.h" 55#include "webrtc/base/ssladapter.h" 56 57@implementation RTCPeerConnectionFactory { 58 rtc::scoped_ptr<rtc::Thread> _signalingThread; 59 rtc::scoped_ptr<rtc::Thread> _workerThread; 60} 61 62@synthesize nativeFactory = _nativeFactory; 63 64+ (void)initializeSSL { 65 BOOL initialized = rtc::InitializeSSL(); 66 NSAssert(initialized, @"Failed to initialize SSL library"); 67} 68 69+ (void)deinitializeSSL { 70 BOOL deinitialized = rtc::CleanupSSL(); 71 NSAssert(deinitialized, @"Failed to deinitialize SSL library"); 72} 73 74- (id)init { 75 if ((self = [super init])) { 76 _signalingThread.reset(new rtc::Thread()); 77 BOOL result = _signalingThread->Start(); 78 NSAssert(result, @"Failed to start signaling thread."); 79 _workerThread.reset(new rtc::Thread()); 80 result = _workerThread->Start(); 81 NSAssert(result, @"Failed to start worker thread."); 82 83 _nativeFactory = webrtc::CreatePeerConnectionFactory( 84 _signalingThread.get(), _workerThread.get(), nullptr, nullptr, nullptr); 85 NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); 86 // Uncomment to get sensitive logs emitted (to stderr or logcat). 87 // rtc::LogMessage::LogToDebug(rtc::LS_SENSITIVE); 88 } 89 return self; 90} 91 92- (RTCPeerConnection *)peerConnectionWithConfiguration:(RTCConfiguration *)configuration 93 constraints:(RTCMediaConstraints *)constraints 94 delegate:(id<RTCPeerConnectionDelegate>)delegate { 95 return [[RTCPeerConnection alloc] initWithFactory:self.nativeFactory.get() 96 config:configuration.nativeConfiguration 97 constraints:constraints.constraints 98 delegate:delegate]; 99} 100 101- (RTCPeerConnection*) 102 peerConnectionWithICEServers:(NSArray*)servers 103 constraints:(RTCMediaConstraints*)constraints 104 delegate:(id<RTCPeerConnectionDelegate>)delegate { 105 webrtc::PeerConnectionInterface::IceServers iceServers; 106 for (RTCICEServer* server in servers) { 107 iceServers.push_back(server.iceServer); 108 } 109 RTCPeerConnection* pc = 110 [[RTCPeerConnection alloc] initWithFactory:self.nativeFactory.get() 111 iceServers:iceServers 112 constraints:constraints.constraints]; 113 pc.delegate = delegate; 114 return pc; 115} 116 117- (RTCMediaStream*)mediaStreamWithLabel:(NSString*)label { 118 rtc::scoped_refptr<webrtc::MediaStreamInterface> nativeMediaStream = 119 self.nativeFactory->CreateLocalMediaStream([label UTF8String]); 120 return [[RTCMediaStream alloc] initWithMediaStream:nativeMediaStream]; 121} 122 123- (RTCVideoSource*)videoSourceWithCapturer:(RTCVideoCapturer*)capturer 124 constraints:(RTCMediaConstraints*)constraints { 125 if (!capturer) { 126 return nil; 127 } 128 rtc::scoped_refptr<webrtc::VideoSourceInterface> source = 129 self.nativeFactory->CreateVideoSource([capturer takeNativeCapturer], 130 constraints.constraints); 131 return [[RTCVideoSource alloc] initWithMediaSource:source]; 132} 133 134- (RTCVideoTrack*)videoTrackWithID:(NSString*)videoId 135 source:(RTCVideoSource*)source { 136 rtc::scoped_refptr<webrtc::VideoTrackInterface> track = 137 self.nativeFactory->CreateVideoTrack([videoId UTF8String], 138 source.videoSource); 139 return [[RTCVideoTrack alloc] initWithMediaTrack:track]; 140} 141 142- (RTCAudioTrack*)audioTrackWithID:(NSString*)audioId { 143 rtc::scoped_refptr<webrtc::AudioTrackInterface> track = 144 self.nativeFactory->CreateAudioTrack([audioId UTF8String], NULL); 145 return [[RTCAudioTrack alloc] initWithMediaTrack:track]; 146} 147 148@end 149