
Things included in this CL: - updated READMEs to provide an exact/reproable set of steps for getting the app running. - gyp changes to build the iOS AppRTCDemo sample app using gyp+ninja instead of the hand-crafted Xcode project (which has never worked in its checked-in form), including a gyp action to sign the sample app for deployment to an iOS device (the app can also be used in the simulator) - deleted the busted hand-crafted Xcode project for the sample app - updated the sample app to match the PeerConnection API that ended up landing (in a surprising twist of fate, the API landed quite a bit later than the sample app and this is the first time the CR-time changes in the API are reflected in the sample app) - updated the sample app to reflect apprtc.appspot.com HTML/JS changes (equiv to the AppRTCClient.java changes in http://s10/47299162) - picked up the iossim DEPS to enable launching the sample app in the simulator from the command-line. - renamed some files to match capitalization of the classes they contain (Ice -> ICE) per ObjC naming guidelines. - ran the files involved in this CL through clang-format to deal with xcode formatting craxy. BUG=2106 RISK=P2 TESTED=unittest builds with ninja and passes on OS=mac; sample app builds with ninja and runs on simulator and device, though no audio flows from simulator/device (will fix in a follow-up CL) R=andrew@webrtc.org, justincohen@google.com, wu@webrtc.org Review URL: https://webrtc-codereview.appspot.com/1874005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4466 4adac7df-926f-26a2-2b94-8c16560cd09d
141 lines
5.5 KiB
Plaintext
141 lines
5.5 KiB
Plaintext
/*
|
|
* libjingle
|
|
* Copyright 2013, Google Inc.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#if !defined(__has_feature) || !__has_feature(objc_arc)
|
|
#error "This file requires ARC support."
|
|
#endif
|
|
|
|
#import "RTCPeerConnectionFactory.h"
|
|
|
|
#include <vector>
|
|
|
|
#import "RTCAudioTrack+internal.h"
|
|
#import "RTCICEServer+internal.h"
|
|
#import "RTCMediaConstraints+internal.h"
|
|
#import "RTCMediaSource+internal.h"
|
|
#import "RTCMediaStream+internal.h"
|
|
#import "RTCMediaStreamTrack+internal.h"
|
|
#import "RTCPeerConnection+internal.h"
|
|
#import "RTCPeerConnectionDelegate.h"
|
|
#import "RTCPeerConnectionObserver.h"
|
|
#import "RTCVideoCapturer+internal.h"
|
|
#import "RTCVideoSource+internal.h"
|
|
#import "RTCVideoTrack+internal.h"
|
|
|
|
#include "talk/app/webrtc/audiotrack.h"
|
|
#include "talk/app/webrtc/mediastreaminterface.h"
|
|
#include "talk/app/webrtc/peerconnectionfactory.h"
|
|
#include "talk/app/webrtc/peerconnectioninterface.h"
|
|
#include "talk/app/webrtc/videosourceinterface.h"
|
|
#include "talk/app/webrtc/videotrack.h"
|
|
#include "talk/base/logging.h"
|
|
#include "talk/base/ssladapter.h"
|
|
|
|
@interface RTCPeerConnectionFactory ()
|
|
|
|
@property(nonatomic, assign) talk_base::scoped_refptr<
|
|
webrtc::PeerConnectionFactoryInterface> nativeFactory;
|
|
|
|
@end
|
|
|
|
@implementation RTCPeerConnectionFactory
|
|
|
|
+ (void)initializeSSL {
|
|
BOOL initialized = talk_base::InitializeSSL();
|
|
NSAssert(initialized, @"Failed to initialize SSL library");
|
|
}
|
|
|
|
+ (void)deinitializeSSL {
|
|
BOOL deinitialized = talk_base::CleanupSSL();
|
|
NSAssert(deinitialized, @"Failed to deinitialize SSL library");
|
|
}
|
|
|
|
- (id)init {
|
|
if ((self = [super init])) {
|
|
_nativeFactory = webrtc::CreatePeerConnectionFactory();
|
|
NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!");
|
|
// Uncomment to get sensitive logs emitted (to stderr or logcat).
|
|
// talk_base::LogMessage::LogToDebug(talk_base::LS_SENSITIVE);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (RTCPeerConnection *)
|
|
peerConnectionWithICEServers:(NSArray *)servers
|
|
constraints:(RTCMediaConstraints *)constraints
|
|
delegate:(id<RTCPeerConnectionDelegate>)delegate {
|
|
webrtc::PeerConnectionInterface::IceServers iceServers;
|
|
for (RTCICEServer *server in servers) {
|
|
iceServers.push_back(server.iceServer);
|
|
}
|
|
webrtc::RTCPeerConnectionObserver *observer =
|
|
new webrtc::RTCPeerConnectionObserver(delegate);
|
|
webrtc::DTLSIdentityServiceInterface* dummy_dtls_identity_service = NULL;
|
|
talk_base::scoped_refptr<webrtc::PeerConnectionInterface> peerConnection =
|
|
self.nativeFactory->CreatePeerConnection(
|
|
iceServers, constraints.constraints, dummy_dtls_identity_service,
|
|
observer);
|
|
RTCPeerConnection *pc =
|
|
[[RTCPeerConnection alloc] initWithPeerConnection:peerConnection
|
|
observer:observer];
|
|
observer->SetPeerConnection(pc);
|
|
return pc;
|
|
}
|
|
|
|
- (RTCMediaStream *)mediaStreamWithLabel:(NSString *)label {
|
|
talk_base::scoped_refptr<webrtc::MediaStreamInterface> nativeMediaStream =
|
|
self.nativeFactory->CreateLocalMediaStream([label UTF8String]);
|
|
return [[RTCMediaStream alloc] initWithMediaStream:nativeMediaStream];
|
|
}
|
|
|
|
- (RTCVideoSource *)videoSourceWithCapturer:(RTCVideoCapturer *)capturer
|
|
constraints:(RTCMediaConstraints *)constraints {
|
|
if (!capturer) {
|
|
return nil;
|
|
}
|
|
talk_base::scoped_refptr<webrtc::VideoSourceInterface> source =
|
|
self.nativeFactory->CreateVideoSource(capturer.capturer.get(),
|
|
constraints.constraints);
|
|
return [[RTCVideoSource alloc] initWithMediaSource:source];
|
|
}
|
|
|
|
- (RTCVideoTrack *)videoTrackWithID:(NSString *)videoId
|
|
source:(RTCVideoSource *)source {
|
|
talk_base::scoped_refptr<webrtc::VideoTrackInterface> track =
|
|
self.nativeFactory->CreateVideoTrack([videoId UTF8String],
|
|
source.videoSource);
|
|
return [[RTCVideoTrack alloc] initWithMediaTrack:track];
|
|
}
|
|
|
|
- (RTCAudioTrack *)audioTrackWithID:(NSString *)audioId {
|
|
talk_base::scoped_refptr<webrtc::AudioTrackInterface> track =
|
|
self.nativeFactory->CreateAudioTrack([audioId UTF8String], NULL);
|
|
return [[RTCAudioTrack alloc] initWithMediaTrack:track];
|
|
}
|
|
|
|
@end
|