(Auto)update libjingle 62865357-> 62871616
git-svn-id: http://webrtc.googlecode.com/svn/trunk@5674 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@@ -126,14 +126,14 @@
|
|||||||
[[RTCAudioTrack alloc] initWithMediaTrack:track];
|
[[RTCAudioTrack alloc] initWithMediaTrack:track];
|
||||||
[_audioTracks addObject:audioTrack];
|
[_audioTracks addObject:audioTrack];
|
||||||
}
|
}
|
||||||
// TODO(hughv): Add video.
|
|
||||||
// for (size_t i = 0; i < video_tracks.size(); ++i) {
|
for (size_t i = 0; i < video_tracks.size(); ++i) {
|
||||||
// talk_base::scoped_refptr<webrtc::VideoTrackInterface> track =
|
talk_base::scoped_refptr<webrtc::VideoTrackInterface> track =
|
||||||
// video_tracks[i];
|
video_tracks[i];
|
||||||
// RTCVideoTrack *videoTrack =
|
RTCVideoTrack* videoTrack =
|
||||||
// [[RTCVideoTrack alloc] initWithMediaTrack:track];
|
[[RTCVideoTrack alloc] initWithMediaTrack:track];
|
||||||
// [_videoTracks addObject:videoTrack];
|
[_videoTracks addObject:videoTrack];
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@@ -120,7 +120,7 @@
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
talk_base::scoped_refptr<webrtc::VideoSourceInterface> source =
|
talk_base::scoped_refptr<webrtc::VideoSourceInterface> source =
|
||||||
self.nativeFactory->CreateVideoSource(capturer.capturer.get(),
|
self.nativeFactory->CreateVideoSource([capturer release_native_capturer],
|
||||||
constraints.constraints);
|
constraints.constraints);
|
||||||
return [[RTCVideoSource alloc] initWithMediaSource:source];
|
return [[RTCVideoSource alloc] initWithMediaSource:source];
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
@interface RTCVideoCapturer (Internal)
|
@interface RTCVideoCapturer (Internal)
|
||||||
|
|
||||||
@property(nonatomic, assign, readonly) const talk_base::scoped_ptr<cricket::VideoCapturer> &capturer;
|
- (cricket::VideoCapturer*)release_native_capturer;
|
||||||
|
|
||||||
- (id)initWithCapturer:(cricket::VideoCapturer*)capturer;
|
- (id)initWithCapturer:(cricket::VideoCapturer*)capturer;
|
||||||
|
|
||||||
|
@@ -67,10 +67,8 @@
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(hughv): When capturer is implemented, this needs to return
|
- (cricket::VideoCapturer*)release_native_capturer {
|
||||||
// _capturer.release() instead. For now, this isn't used.
|
return _capturer.release();
|
||||||
- (const talk_base::scoped_ptr<cricket::VideoCapturer> &)capturer {
|
|
||||||
return _capturer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -35,6 +35,4 @@
|
|||||||
@property(nonatomic, assign, readonly)
|
@property(nonatomic, assign, readonly)
|
||||||
webrtc::VideoRendererInterface *videoRenderer;
|
webrtc::VideoRendererInterface *videoRenderer;
|
||||||
|
|
||||||
- (id)initWithVideoRenderer:(webrtc::VideoRendererInterface *)videoRenderer;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -33,18 +33,70 @@
|
|||||||
|
|
||||||
#if TARGET_OS_IPHONE
|
#if TARGET_OS_IPHONE
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#import "RTCI420Frame.h"
|
#import "RTCI420Frame.h"
|
||||||
#import "RTCVideoRendererDelegate.h"
|
#import "RTCVideoRendererDelegate.h"
|
||||||
|
|
||||||
@implementation RTCVideoRenderer
|
#import "webrtc/modules/video_render/ios/video_render_ios_impl.h"
|
||||||
|
#import "webrtc/modules/video_render/ios/video_render_ios_view.h"
|
||||||
|
|
||||||
|
#include "common_video/interface/i420_video_frame.h"
|
||||||
|
#include "talk/app/webrtc/mediastreaminterface.h"
|
||||||
|
#include "talk/media/base/videoframe.h"
|
||||||
|
#include "webrtc/modules/video_render/include/video_render_defines.h"
|
||||||
|
|
||||||
|
// An adapter presenting VideoRendererInterface's API and delegating to
|
||||||
|
// a VideoRenderCallback. Suitable for feeding to
|
||||||
|
// VideoTrackInterface::AddRenderer().
|
||||||
|
class CallbackConverter : public webrtc::VideoRendererInterface {
|
||||||
|
|
||||||
|
public:
|
||||||
|
CallbackConverter(webrtc::VideoRenderCallback* callback,
|
||||||
|
const uint32_t streamId)
|
||||||
|
: callback_(callback), streamId_(streamId) {}
|
||||||
|
|
||||||
|
virtual void SetSize(int width, int height) {};
|
||||||
|
virtual void RenderFrame(const cricket::VideoFrame* frame) {
|
||||||
|
// Make this into an I420VideoFrame.
|
||||||
|
size_t width = frame->GetWidth();
|
||||||
|
size_t height = frame->GetHeight();
|
||||||
|
|
||||||
|
size_t y_plane_size = width * height;
|
||||||
|
size_t uv_plane_size = frame->GetChromaSize();
|
||||||
|
|
||||||
|
webrtc::I420VideoFrame i420Frame;
|
||||||
|
i420Frame.CreateFrame(y_plane_size,
|
||||||
|
frame->GetYPlane(),
|
||||||
|
uv_plane_size,
|
||||||
|
frame->GetUPlane(),
|
||||||
|
uv_plane_size,
|
||||||
|
frame->GetVPlane(),
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
frame->GetYPitch(),
|
||||||
|
frame->GetUPitch(),
|
||||||
|
frame->GetVPitch());
|
||||||
|
|
||||||
|
i420Frame.set_render_time_ms(frame->GetTimeStamp() / 1000000);
|
||||||
|
|
||||||
|
callback_->RenderFrame(streamId_, i420Frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
webrtc::VideoRenderCallback* callback_;
|
||||||
|
const uint32_t streamId_;
|
||||||
|
};
|
||||||
|
|
||||||
|
@implementation RTCVideoRenderer {
|
||||||
|
CallbackConverter* _converter;
|
||||||
|
talk_base::scoped_ptr<webrtc::VideoRenderIosImpl> _iosRenderer;
|
||||||
|
}
|
||||||
|
|
||||||
@synthesize delegate = _delegate;
|
@synthesize delegate = _delegate;
|
||||||
|
|
||||||
+ (RTCVideoRenderer *)videoRenderGUIWithFrame:(CGRect)frame {
|
+ (RTCVideoRenderer *)videoRenderGUIWithFrame:(CGRect)frame {
|
||||||
// TODO (hughv): Implement.
|
return [[RTCVideoRenderer alloc]
|
||||||
return nil;
|
initWithRenderView:[RTCVideoRenderer newRenderViewWithFrame:frame]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate {
|
- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate {
|
||||||
@@ -55,20 +107,93 @@
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (UIView*)newRenderViewWithFrame:(CGRect)frame {
|
||||||
|
VideoRenderIosView* newView =
|
||||||
|
[[VideoRenderIosView alloc] initWithFrame:frame];
|
||||||
|
return newView;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithRenderView:(UIView*)view {
|
||||||
|
NSAssert([view isKindOfClass:[VideoRenderIosView class]],
|
||||||
|
@"The view must be of kind 'VideoRenderIosView'");
|
||||||
|
if ((self = [super init])) {
|
||||||
|
VideoRenderIosView* renderView = (VideoRenderIosView*)view;
|
||||||
|
_iosRenderer.reset(
|
||||||
|
new webrtc::VideoRenderIosImpl(0, (__bridge void*)renderView, NO));
|
||||||
|
if (_iosRenderer->Init() != -1) {
|
||||||
|
webrtc::VideoRenderCallback* callback =
|
||||||
|
_iosRenderer->AddIncomingRenderStream(0, 1, 0, 0, 1, 1);
|
||||||
|
_converter = new CallbackConverter(callback, 0);
|
||||||
|
_iosRenderer->StartRender();
|
||||||
|
} else {
|
||||||
|
self = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)start {
|
||||||
|
_iosRenderer->StartRender();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)stop {
|
||||||
|
_iosRenderer->StopRender();
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation RTCVideoRenderer (Internal)
|
@implementation RTCVideoRenderer (Internal)
|
||||||
|
|
||||||
|
- (webrtc::VideoRendererInterface*)videoRenderer {
|
||||||
|
return _converter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
#else // TARGET_OS_IPHONE
|
||||||
|
|
||||||
|
// TODO(fischman): implement an OS/X RTCVideoRenderer (and add to
|
||||||
|
// RTCPeerConnectionTest!).
|
||||||
|
|
||||||
|
#import "RTCI420Frame.h"
|
||||||
|
#import "RTCVideoRendererDelegate.h"
|
||||||
|
@implementation RTCVideoRenderer
|
||||||
|
@synthesize delegate = _delegate;
|
||||||
|
+ (RTCVideoRenderer*)videoRenderGUIWithFrame:(CGRect)frame {
|
||||||
|
// TODO(hughv): Implement.
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate {
|
||||||
|
if ((self = [super init])) {
|
||||||
|
_delegate = delegate;
|
||||||
|
// TODO(hughv): Create video renderer.
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (UIView*)newRenderViewWithFrame:(CGRect)frame {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
- (id)initWithRenderView:(UIView*)renderView {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
- (void)start {
|
||||||
|
}
|
||||||
|
- (void)stop {
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
@implementation RTCVideoRenderer (Internal)
|
||||||
- (id)initWithVideoRenderer:(webrtc::VideoRendererInterface *)videoRenderer {
|
- (id)initWithVideoRenderer:(webrtc::VideoRendererInterface *)videoRenderer {
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
// TODO(hughv): Implement.
|
// TODO(hughv): Implement.
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (webrtc::VideoRendererInterface *)videoRenderer {
|
- (webrtc::VideoRendererInterface *)videoRenderer {
|
||||||
// TODO(hughv): Implement.
|
// TODO(hughv): Implement.
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
#endif // TARGET_OS_IPHONE
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
@protocol RTCVideoRendererDelegate;
|
@protocol RTCVideoRendererDelegate;
|
||||||
struct CGRect;
|
struct CGRect;
|
||||||
|
@class UIView;
|
||||||
|
|
||||||
// Interface for rendering VideoFrames from a VideoTrack
|
// Interface for rendering VideoFrames from a VideoTrack
|
||||||
@interface RTCVideoRenderer : NSObject
|
@interface RTCVideoRenderer : NSObject
|
||||||
@@ -38,11 +39,20 @@ struct CGRect;
|
|||||||
// A convenience method to create a renderer and window and render frames into
|
// A convenience method to create a renderer and window and render frames into
|
||||||
// that window.
|
// that window.
|
||||||
+ (RTCVideoRenderer *)videoRenderGUIWithFrame:(CGRect)frame;
|
+ (RTCVideoRenderer *)videoRenderGUIWithFrame:(CGRect)frame;
|
||||||
|
+ (UIView*)newRenderViewWithFrame:(CGRect)frame;
|
||||||
|
// The view to the following constructor
|
||||||
|
// must be one of the views from newRenderViewWithFrame.
|
||||||
|
- (id)initWithRenderView:(UIView*)renderView;
|
||||||
|
|
||||||
// Initialize the renderer. Requires a delegate which does the actual drawing
|
// Initialize the renderer. Requires a delegate which does the actual drawing
|
||||||
// of frames.
|
// of frames.
|
||||||
- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate;
|
- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate;
|
||||||
|
|
||||||
|
// Starts rendering.
|
||||||
|
- (void)start;
|
||||||
|
// Stops rendering. It can be restarted again using the 'start' method above.
|
||||||
|
- (void)stop;
|
||||||
|
|
||||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||||
// Disallow init and don't add to documentation
|
// Disallow init and don't add to documentation
|
||||||
- (id)init __attribute__(
|
- (id)init __attribute__(
|
||||||
|
@@ -922,7 +922,12 @@ void StatsCollector::UpdateStatsFromExistingLocalAudioTracks() {
|
|||||||
std::string ssrc_id = talk_base::ToString<uint32>(ssrc);
|
std::string ssrc_id = talk_base::ToString<uint32>(ssrc);
|
||||||
StatsReport* report = GetReport(StatsReport::kStatsReportTypeSsrc,
|
StatsReport* report = GetReport(StatsReport::kStatsReportTypeSsrc,
|
||||||
ssrc_id);
|
ssrc_id);
|
||||||
ASSERT(report != NULL);
|
if (report == NULL) {
|
||||||
|
// This can happen if a local audio track is added to a stream on the
|
||||||
|
// fly and the report has not been set up yet. Do nothing in this case.
|
||||||
|
LOG(LS_ERROR) << "Stats report does not exist for ssrc " << ssrc;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// The same ssrc can be used by both local and remote audio tracks.
|
// The same ssrc can be used by both local and remote audio tracks.
|
||||||
std::string track_id;
|
std::string track_id;
|
||||||
|
@@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@class RTCMediaConstraints;
|
||||||
|
|
||||||
// Negotiates signaling for chatting with apprtc.appspot.com "rooms".
|
// Negotiates signaling for chatting with apprtc.appspot.com "rooms".
|
||||||
// Uses the client<->server specifics of the apprtc AppEngine webapp.
|
// Uses the client<->server specifics of the apprtc AppEngine webapp.
|
||||||
//
|
//
|
||||||
@@ -48,6 +50,7 @@
|
|||||||
@property(nonatomic, assign) id<ICEServerDelegate> ICEServerDelegate;
|
@property(nonatomic, assign) id<ICEServerDelegate> ICEServerDelegate;
|
||||||
@property(nonatomic, assign) id<GAEMessageHandler> messageHandler;
|
@property(nonatomic, assign) id<GAEMessageHandler> messageHandler;
|
||||||
@property(nonatomic, assign) BOOL initiator;
|
@property(nonatomic, assign) BOOL initiator;
|
||||||
|
@property(nonatomic, strong) RTCMediaConstraints* videoConstraints;
|
||||||
|
|
||||||
- (void)connectToRoom:(NSURL *)room;
|
- (void)connectToRoom:(NSURL *)room;
|
||||||
- (void)sendData:(NSData *)data;
|
- (void)sendData:(NSData *)data;
|
||||||
|
@@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
#import "GAEChannelClient.h"
|
#import "GAEChannelClient.h"
|
||||||
#import "RTCICEServer.h"
|
#import "RTCICEServer.h"
|
||||||
|
#import "APPRTCAppDelegate.h"
|
||||||
|
#import "RTCMediaConstraints.h"
|
||||||
|
|
||||||
@interface APPRTCAppClient ()
|
@interface APPRTCAppClient ()
|
||||||
|
|
||||||
@@ -62,6 +64,7 @@
|
|||||||
@synthesize token = _token;
|
@synthesize token = _token;
|
||||||
@synthesize verboseLogging = _verboseLogging;
|
@synthesize verboseLogging = _verboseLogging;
|
||||||
@synthesize initiator = _initiator;
|
@synthesize initiator = _initiator;
|
||||||
|
@synthesize videoConstraints = _videoConstraints;
|
||||||
|
|
||||||
- (id)init {
|
- (id)init {
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
@@ -263,6 +266,9 @@
|
|||||||
options:0
|
options:0
|
||||||
range:NSMakeRange(0, [self.roomHtml length])]) {
|
range:NSMakeRange(0, [self.roomHtml length])]) {
|
||||||
[self showMessage:@"Room full"];
|
[self showMessage:@"Room full"];
|
||||||
|
APPRTCAppDelegate *ad =
|
||||||
|
(APPRTCAppDelegate *)[[UIApplication sharedApplication] delegate];
|
||||||
|
[ad closeVideoUI];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,6 +337,18 @@
|
|||||||
}
|
}
|
||||||
[self updateICEServers:ICEServers withTurnServer:turnServerUrl];
|
[self updateICEServers:ICEServers withTurnServer:turnServerUrl];
|
||||||
|
|
||||||
|
NSString* mc = [self findVar:@"mediaConstraints" strippingQuotes:NO];
|
||||||
|
if (mc) {
|
||||||
|
error = nil;
|
||||||
|
NSData *mcData = [mc dataUsingEncoding:NSUTF8StringEncoding];
|
||||||
|
json =
|
||||||
|
[NSJSONSerialization JSONObjectWithData:mcData options:0 error:&error];
|
||||||
|
NSAssert(!error, @"Unable to parse. %@", error.localizedDescription);
|
||||||
|
if ([[json objectForKey:@"video"] boolValue]) {
|
||||||
|
self.videoConstraints = [[RTCMediaConstraints alloc] init];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[self maybeLogMessage:
|
[self maybeLogMessage:
|
||||||
[NSString stringWithFormat:@"About to open GAE with token: %@",
|
[NSString stringWithFormat:@"About to open GAE with token: %@",
|
||||||
self.token]];
|
self.token]];
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
@class APPRTCViewController;
|
@class APPRTCViewController;
|
||||||
|
@class RTCVideoTrack;
|
||||||
|
|
||||||
// The main application class of the AppRTCDemo iOS app demonstrating
|
// The main application class of the AppRTCDemo iOS app demonstrating
|
||||||
// interoperability between the Objcective C implementation of PeerConnection
|
// interoperability between the Objcective C implementation of PeerConnection
|
||||||
@@ -53,4 +54,6 @@
|
|||||||
@property (strong, nonatomic) UIWindow *window;
|
@property (strong, nonatomic) UIWindow *window;
|
||||||
@property (strong, nonatomic) APPRTCViewController *viewController;
|
@property (strong, nonatomic) APPRTCViewController *viewController;
|
||||||
|
|
||||||
|
- (void)closeVideoUI;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -25,6 +25,8 @@
|
|||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#import <AVFoundation/AVFoundation.h>
|
||||||
|
|
||||||
#import "APPRTCAppDelegate.h"
|
#import "APPRTCAppDelegate.h"
|
||||||
|
|
||||||
#import "APPRTCViewController.h"
|
#import "APPRTCViewController.h"
|
||||||
@@ -37,17 +39,25 @@
|
|||||||
#import "RTCPeerConnectionDelegate.h"
|
#import "RTCPeerConnectionDelegate.h"
|
||||||
#import "RTCPeerConnectionFactory.h"
|
#import "RTCPeerConnectionFactory.h"
|
||||||
#import "RTCSessionDescription.h"
|
#import "RTCSessionDescription.h"
|
||||||
|
#import "RTCVideoRenderer.h"
|
||||||
|
#import "RTCVideoCapturer.h"
|
||||||
|
#import "RTCVideoTrack.h"
|
||||||
|
#import "VideoView.h"
|
||||||
|
|
||||||
@interface PCObserver : NSObject<RTCPeerConnectionDelegate>
|
@interface PCObserver : NSObject<RTCPeerConnectionDelegate>
|
||||||
|
|
||||||
- (id)initWithDelegate:(id<APPRTCSendMessage>)delegate;
|
- (id)initWithDelegate:(id<APPRTCSendMessage>)delegate;
|
||||||
|
|
||||||
|
@property(nonatomic, strong) VideoView *videoView;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation PCObserver {
|
@implementation PCObserver {
|
||||||
id<APPRTCSendMessage> _delegate;
|
id<APPRTCSendMessage> _delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@synthesize videoView = _videoView;
|
||||||
|
|
||||||
- (id)initWithDelegate:(id<APPRTCSendMessage>)delegate {
|
- (id)initWithDelegate:(id<APPRTCSendMessage>)delegate {
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
_delegate = delegate;
|
_delegate = delegate;
|
||||||
@@ -71,16 +81,18 @@
|
|||||||
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
||||||
NSAssert([stream.audioTracks count] >= 1,
|
NSAssert([stream.audioTracks count] >= 1,
|
||||||
@"Expected at least 1 audio stream");
|
@"Expected at least 1 audio stream");
|
||||||
//NSAssert([stream.videoTracks count] >= 1,
|
NSAssert([stream.videoTracks count] <= 1,
|
||||||
// @"Expected at least 1 video stream");
|
@"Expected at most 1 video stream");
|
||||||
// TODO(hughv): Add video support
|
if ([stream.videoTracks count] != 0) {
|
||||||
|
[[self videoView]
|
||||||
|
renderVideoTrackInterface:[stream.videoTracks objectAtIndex:0]];
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
removedStream:(RTCMediaStream *)stream {
|
removedStream:(RTCMediaStream *)stream {
|
||||||
NSLog(@"PCO onRemoveStream.");
|
NSLog(@"PCO onRemoveStream.");
|
||||||
// TODO(hughv): Remove video track.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)
|
- (void)
|
||||||
@@ -166,8 +178,7 @@
|
|||||||
|
|
||||||
- (void)applicationWillResignActive:(UIApplication *)application {
|
- (void)applicationWillResignActive:(UIApplication *)application {
|
||||||
[self displayLogMessage:@"Application lost focus, connection broken."];
|
[self displayLogMessage:@"Application lost focus, connection broken."];
|
||||||
[self disconnect];
|
[self closeVideoUI];
|
||||||
[self.viewController resetUI];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)applicationDidEnterBackground:(UIApplication *)application {
|
- (void)applicationDidEnterBackground:(UIApplication *)application {
|
||||||
@@ -212,7 +223,21 @@
|
|||||||
- (void)onICEServers:(NSArray *)servers {
|
- (void)onICEServers:(NSArray *)servers {
|
||||||
self.queuedRemoteCandidates = [NSMutableArray array];
|
self.queuedRemoteCandidates = [NSMutableArray array];
|
||||||
self.peerConnectionFactory = [[RTCPeerConnectionFactory alloc] init];
|
self.peerConnectionFactory = [[RTCPeerConnectionFactory alloc] init];
|
||||||
RTCMediaConstraints *constraints = [[RTCMediaConstraints alloc] init];
|
RTCMediaConstraints *constraints = [[RTCMediaConstraints alloc]
|
||||||
|
initWithMandatoryConstraints:
|
||||||
|
@[[[RTCPair alloc]
|
||||||
|
initWithKey:@"OfferToReceiveAudio"
|
||||||
|
value:@"true"],
|
||||||
|
[[RTCPair alloc]
|
||||||
|
initWithKey:@"OfferToReceiveVideo"
|
||||||
|
value:@"true"]]
|
||||||
|
optionalConstraints:
|
||||||
|
@[[[RTCPair alloc]
|
||||||
|
initWithKey:@"internalSctpDataChannels"
|
||||||
|
value:@"true"],
|
||||||
|
[[RTCPair alloc]
|
||||||
|
initWithKey:@"DtlsSrtpKeyAgreement"
|
||||||
|
value:@"true"]]];
|
||||||
self.pcObserver = [[PCObserver alloc] initWithDelegate:self];
|
self.pcObserver = [[PCObserver alloc] initWithDelegate:self];
|
||||||
self.peerConnection =
|
self.peerConnection =
|
||||||
[self.peerConnectionFactory peerConnectionWithICEServers:servers
|
[self.peerConnectionFactory peerConnectionWithICEServers:servers
|
||||||
@@ -220,7 +245,34 @@
|
|||||||
delegate:self.pcObserver];
|
delegate:self.pcObserver];
|
||||||
RTCMediaStream *lms =
|
RTCMediaStream *lms =
|
||||||
[self.peerConnectionFactory mediaStreamWithLabel:@"ARDAMS"];
|
[self.peerConnectionFactory mediaStreamWithLabel:@"ARDAMS"];
|
||||||
// TODO(hughv): Add video.
|
|
||||||
|
NSString *cameraID = nil;
|
||||||
|
for (AVCaptureDevice *captureDevice in
|
||||||
|
[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] ) {
|
||||||
|
if (captureDevice.position == AVCaptureDevicePositionFront) {
|
||||||
|
cameraID = [captureDevice localizedName];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NSAssert(cameraID, @"Unable to get the front camera id");
|
||||||
|
|
||||||
|
RTCVideoCapturer *capturer =
|
||||||
|
[RTCVideoCapturer capturerWithDeviceName:cameraID];
|
||||||
|
RTCVideoSource *videoSource =
|
||||||
|
[self.peerConnectionFactory
|
||||||
|
videoSourceWithCapturer:capturer constraints:self.client.videoConstraints];
|
||||||
|
RTCVideoTrack *localVideoTrack =
|
||||||
|
[self.peerConnectionFactory
|
||||||
|
videoTrackWithID:@"ARDAMSv0" source:videoSource];
|
||||||
|
if (localVideoTrack) {
|
||||||
|
[lms addVideoTrack:localVideoTrack];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self.viewController.localVideoView
|
||||||
|
renderVideoTrackInterface:localVideoTrack];
|
||||||
|
|
||||||
|
self.pcObserver.videoView = self.viewController.remoteVideoView;
|
||||||
|
|
||||||
[lms addAudioTrack:[self.peerConnectionFactory audioTrackWithID:@"ARDAMSa0"]];
|
[lms addAudioTrack:[self.peerConnectionFactory audioTrackWithID:@"ARDAMSa0"]];
|
||||||
[self.peerConnection addStream:lms constraints:constraints];
|
[self.peerConnection addStream:lms constraints:constraints];
|
||||||
[self displayLogMessage:@"onICEServers - add local stream."];
|
[self displayLogMessage:@"onICEServers - add local stream."];
|
||||||
@@ -236,10 +288,9 @@
|
|||||||
[self displayLogMessage:@"GAE onOpen - create offer."];
|
[self displayLogMessage:@"GAE onOpen - create offer."];
|
||||||
RTCPair *audio =
|
RTCPair *audio =
|
||||||
[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" value:@"true"];
|
[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" value:@"true"];
|
||||||
// TODO(hughv): Add video.
|
RTCPair *video = [[RTCPair alloc] initWithKey:@"OfferToReceiveVideo"
|
||||||
// RTCPair *video = [[RTCPair alloc] initWithKey:@"OfferToReceiveVideo"
|
value:@"true"];
|
||||||
// value:@"true"];
|
NSArray *mandatory = @[ audio , video ];
|
||||||
NSArray *mandatory = @[ audio /*, video*/ ];
|
|
||||||
RTCMediaConstraints *constraints =
|
RTCMediaConstraints *constraints =
|
||||||
[[RTCMediaConstraints alloc] initWithMandatoryConstraints:mandatory
|
[[RTCMediaConstraints alloc] initWithMandatoryConstraints:mandatory
|
||||||
optionalConstraints:nil];
|
optionalConstraints:nil];
|
||||||
@@ -283,7 +334,14 @@
|
|||||||
sessionDescription:sdp];
|
sessionDescription:sdp];
|
||||||
[self displayLogMessage:@"PC - setRemoteDescription."];
|
[self displayLogMessage:@"PC - setRemoteDescription."];
|
||||||
} else if ([value compare:@"bye"] == NSOrderedSame) {
|
} else if ([value compare:@"bye"] == NSOrderedSame) {
|
||||||
[self disconnect];
|
[self closeVideoUI];
|
||||||
|
UIAlertView *alertView =
|
||||||
|
[[UIAlertView alloc] initWithTitle:@"Remote end hung up"
|
||||||
|
message:@"dropping PeerConnection"
|
||||||
|
delegate:nil
|
||||||
|
cancelButtonTitle:@"OK"
|
||||||
|
otherButtonTitles:nil];
|
||||||
|
[alertView show];
|
||||||
} else {
|
} else {
|
||||||
NSAssert(NO, @"Invalid message: %@", data);
|
NSAssert(NO, @"Invalid message: %@", data);
|
||||||
}
|
}
|
||||||
@@ -291,13 +349,13 @@
|
|||||||
|
|
||||||
- (void)onClose {
|
- (void)onClose {
|
||||||
[self displayLogMessage:@"GAE onClose."];
|
[self displayLogMessage:@"GAE onClose."];
|
||||||
[self disconnect];
|
[self closeVideoUI];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)onError:(int)code withDescription:(NSString *)description {
|
- (void)onError:(int)code withDescription:(NSString *)description {
|
||||||
[self displayLogMessage:
|
[self displayLogMessage:
|
||||||
[NSString stringWithFormat:@"GAE onError: %@", description]];
|
[NSString stringWithFormat:@"GAE onError: %@", description]];
|
||||||
[self disconnect];
|
[self closeVideoUI];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - RTCSessionDescriptonDelegate methods
|
#pragma mark - RTCSessionDescriptonDelegate methods
|
||||||
@@ -411,11 +469,10 @@
|
|||||||
RTCPair *audio =
|
RTCPair *audio =
|
||||||
[[RTCPair alloc]
|
[[RTCPair alloc]
|
||||||
initWithKey:@"OfferToReceiveAudio" value:@"true"];
|
initWithKey:@"OfferToReceiveAudio" value:@"true"];
|
||||||
// TODO(hughv): Add video.
|
RTCPair *video =
|
||||||
// RTCPair *video =
|
[[RTCPair alloc]
|
||||||
// [[RTCPair alloc]
|
initWithKey:@"OfferToReceiveVideo" value:@"true"];
|
||||||
// initWithKey:@"OfferToReceiveVideo" value:@"true"];
|
NSArray *mandatory = @[ audio , video ];
|
||||||
NSArray *mandatory = @[ audio /*, video*/ ];
|
|
||||||
RTCMediaConstraints *constraints =
|
RTCMediaConstraints *constraints =
|
||||||
[[RTCMediaConstraints alloc]
|
[[RTCMediaConstraints alloc]
|
||||||
initWithMandatoryConstraints:mandatory
|
initWithMandatoryConstraints:mandatory
|
||||||
@@ -441,6 +498,7 @@
|
|||||||
- (void)disconnect {
|
- (void)disconnect {
|
||||||
[self.client
|
[self.client
|
||||||
sendData:[@"{\"type\": \"bye\"}" dataUsingEncoding:NSUTF8StringEncoding]];
|
sendData:[@"{\"type\": \"bye\"}" dataUsingEncoding:NSUTF8StringEncoding]];
|
||||||
|
[self.peerConnection close];
|
||||||
self.peerConnection = nil;
|
self.peerConnection = nil;
|
||||||
self.peerConnectionFactory = nil;
|
self.peerConnectionFactory = nil;
|
||||||
self.pcObserver = nil;
|
self.pcObserver = nil;
|
||||||
@@ -479,4 +537,11 @@
|
|||||||
return removeBackslash;
|
return removeBackslash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - public methods
|
||||||
|
|
||||||
|
- (void)closeVideoUI {
|
||||||
|
[self disconnect];
|
||||||
|
[self.viewController resetUI];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@@ -27,12 +27,18 @@
|
|||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@class VideoView;
|
||||||
|
|
||||||
// The view controller that is displayed when AppRTCDemo is loaded.
|
// The view controller that is displayed when AppRTCDemo is loaded.
|
||||||
@interface APPRTCViewController : UIViewController<UITextFieldDelegate>
|
@interface APPRTCViewController : UIViewController<UITextFieldDelegate>
|
||||||
|
|
||||||
@property (weak, nonatomic) IBOutlet UITextField *textField;
|
@property (weak, nonatomic) IBOutlet UITextField *textField;
|
||||||
@property (weak, nonatomic) IBOutlet UITextView *textInstructions;
|
@property (weak, nonatomic) IBOutlet UITextView *textInstructions;
|
||||||
@property (weak, nonatomic) IBOutlet UITextView *textOutput;
|
@property (weak, nonatomic) IBOutlet UITextView *textOutput;
|
||||||
|
@property(weak, nonatomic) IBOutlet UIView* blackView;
|
||||||
|
|
||||||
|
@property(nonatomic, strong) VideoView* remoteVideoView;
|
||||||
|
@property(nonatomic, strong) VideoView* localVideoView;
|
||||||
|
|
||||||
- (void)displayText:(NSString *)text;
|
- (void)displayText:(NSString *)text;
|
||||||
- (void)resetUI;
|
- (void)resetUI;
|
||||||
|
@@ -27,8 +27,12 @@
|
|||||||
|
|
||||||
#import "APPRTCViewController.h"
|
#import "APPRTCViewController.h"
|
||||||
|
|
||||||
|
#import "VideoView.h"
|
||||||
|
|
||||||
@interface APPRTCViewController ()
|
@interface APPRTCViewController ()
|
||||||
|
|
||||||
|
@property (nonatomic, assign) UIInterfaceOrientation statusBarOrientation;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation APPRTCViewController
|
@implementation APPRTCViewController
|
||||||
@@ -36,13 +40,31 @@
|
|||||||
@synthesize textField = _textField;
|
@synthesize textField = _textField;
|
||||||
@synthesize textInstructions = _textInstructions;
|
@synthesize textInstructions = _textInstructions;
|
||||||
@synthesize textOutput = _textOutput;
|
@synthesize textOutput = _textOutput;
|
||||||
|
@synthesize blackView = _blackView;
|
||||||
|
|
||||||
|
@synthesize remoteVideoView = _remoteVideoView;
|
||||||
|
@synthesize localVideoView = _localVideoView;
|
||||||
|
|
||||||
|
@synthesize statusBarOrientation = _statusBarOrientation;
|
||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
self.statusBarOrientation =
|
||||||
|
[UIApplication sharedApplication].statusBarOrientation;
|
||||||
self.textField.delegate = self;
|
self.textField.delegate = self;
|
||||||
[self.textField becomeFirstResponder];
|
[self.textField becomeFirstResponder];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewDidLayoutSubviews {
|
||||||
|
if (self.statusBarOrientation !=
|
||||||
|
[UIApplication sharedApplication].statusBarOrientation) {
|
||||||
|
self.statusBarOrientation =
|
||||||
|
[UIApplication sharedApplication].statusBarOrientation;
|
||||||
|
[[NSNotificationCenter defaultCenter]
|
||||||
|
postNotificationName:@"StatusBarOrientationDidChange" object:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)displayText:(NSString *)text {
|
- (void)displayText:(NSString *)text {
|
||||||
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
||||||
NSString *output =
|
NSString *output =
|
||||||
@@ -52,11 +74,75 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)resetUI {
|
- (void)resetUI {
|
||||||
|
[self.textField resignFirstResponder];
|
||||||
self.textField.text = nil;
|
self.textField.text = nil;
|
||||||
self.textField.hidden = NO;
|
self.textField.hidden = NO;
|
||||||
self.textInstructions.hidden = NO;
|
self.textInstructions.hidden = NO;
|
||||||
self.textOutput.hidden = YES;
|
self.textOutput.hidden = YES;
|
||||||
self.textOutput.text = nil;
|
self.textOutput.text = nil;
|
||||||
|
self.blackView.hidden = YES;
|
||||||
|
|
||||||
|
[_remoteVideoView stop];
|
||||||
|
[_remoteVideoView removeFromSuperview];
|
||||||
|
self.remoteVideoView = nil;
|
||||||
|
|
||||||
|
[_localVideoView stop];
|
||||||
|
[_localVideoView removeFromSuperview];
|
||||||
|
self.localVideoView = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(fischman): Use video dimensions from the incoming video stream
|
||||||
|
// and resize the Video View accordingly w.r.t. aspect ratio.
|
||||||
|
enum {
|
||||||
|
// Remote video view dimensions.
|
||||||
|
kRemoteVideoWidth = 640,
|
||||||
|
kRemoteVideoHeight = 480,
|
||||||
|
// Padding space for local video view with its parent.
|
||||||
|
kLocalViewPadding = 20
|
||||||
|
};
|
||||||
|
|
||||||
|
- (void)setupCaptureSession {
|
||||||
|
self.blackView.hidden = NO;
|
||||||
|
|
||||||
|
CGRect frame = CGRectMake((self.blackView.bounds.size.width
|
||||||
|
-kRemoteVideoWidth)/2,
|
||||||
|
(self.blackView.bounds.size.height
|
||||||
|
-kRemoteVideoHeight)/2,
|
||||||
|
kRemoteVideoWidth,
|
||||||
|
kRemoteVideoHeight);
|
||||||
|
VideoView *videoView = [[VideoView alloc] initWithFrame:frame];
|
||||||
|
videoView.isRemote = TRUE;
|
||||||
|
|
||||||
|
[self.blackView addSubview:videoView];
|
||||||
|
videoView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
|
||||||
|
UIViewAutoresizingFlexibleRightMargin |
|
||||||
|
UIViewAutoresizingFlexibleBottomMargin |
|
||||||
|
UIViewAutoresizingFlexibleTopMargin;
|
||||||
|
videoView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||||
|
_remoteVideoView = videoView;
|
||||||
|
|
||||||
|
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
|
||||||
|
CGFloat localVideoViewWidth =
|
||||||
|
UIInterfaceOrientationIsPortrait(self.statusBarOrientation) ?
|
||||||
|
screenSize.width/4 : screenSize.height/4;
|
||||||
|
CGFloat localVideoViewHeight =
|
||||||
|
UIInterfaceOrientationIsPortrait(self.statusBarOrientation) ?
|
||||||
|
screenSize.height/4 : screenSize.width/4;
|
||||||
|
frame = CGRectMake(self.blackView.bounds.size.width
|
||||||
|
-localVideoViewWidth-kLocalViewPadding,
|
||||||
|
kLocalViewPadding,
|
||||||
|
localVideoViewWidth,
|
||||||
|
localVideoViewHeight);
|
||||||
|
videoView = [[VideoView alloc] initWithFrame:frame];
|
||||||
|
videoView.isRemote = FALSE;
|
||||||
|
|
||||||
|
[self.blackView addSubview:videoView];
|
||||||
|
videoView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
|
||||||
|
UIViewAutoresizingFlexibleBottomMargin |
|
||||||
|
UIViewAutoresizingFlexibleHeight |
|
||||||
|
UIViewAutoresizingFlexibleWidth;
|
||||||
|
videoView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||||
|
_localVideoView = videoView;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - UITextFieldDelegate
|
#pragma mark - UITextFieldDelegate
|
||||||
@@ -76,6 +162,10 @@
|
|||||||
NSString *url =
|
NSString *url =
|
||||||
[NSString stringWithFormat:@"apprtc://apprtc.appspot.com/?r=%@", room];
|
[NSString stringWithFormat:@"apprtc://apprtc.appspot.com/?r=%@", room];
|
||||||
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
|
||||||
|
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
[self setupCaptureSession];
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||||
|
50
talk/examples/ios/AppRTCDemo/VideoView.h
Normal file
50
talk/examples/ios/AppRTCDemo/VideoView.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@class RTCVideoTrack;
|
||||||
|
|
||||||
|
// This class encapsulates VideoRenderIosView.
|
||||||
|
@interface VideoView : UIView
|
||||||
|
|
||||||
|
// Property to get/set required video orientation.
|
||||||
|
@property(nonatomic, assign) UIInterfaceOrientation videoOrientation;
|
||||||
|
// Specifies whether the object represents a local or remote video stream.
|
||||||
|
@property(nonatomic, assign) BOOL isRemote;
|
||||||
|
|
||||||
|
// Sets up the underlying renderer and track objects.
|
||||||
|
- (void)renderVideoTrackInterface:(RTCVideoTrack*)track;
|
||||||
|
|
||||||
|
// Stops rendering.
|
||||||
|
- (void)pause;
|
||||||
|
// Starts rendering.
|
||||||
|
- (void)resume;
|
||||||
|
// Stops rendering and resets underlying renderer and track objects.
|
||||||
|
- (void)stop;
|
||||||
|
|
||||||
|
@end
|
168
talk/examples/ios/AppRTCDemo/VideoView.m
Normal file
168
talk/examples/ios/AppRTCDemo/VideoView.m
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This VideoView must be initialzed and added to a View to get
|
||||||
|
* either the local or remote video stream rendered.
|
||||||
|
* It is a view itself and it encapsulates
|
||||||
|
* an object of VideoRenderIosView and UIActivityIndicatorView.
|
||||||
|
* Both of the views will get resized as per the frame of their parent.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "VideoView.h"
|
||||||
|
|
||||||
|
#import "RTCVideoRenderer.h"
|
||||||
|
#import "RTCVideoTrack.h"
|
||||||
|
|
||||||
|
@interface VideoView () {
|
||||||
|
RTCVideoTrack *_track;
|
||||||
|
RTCVideoRenderer *_renderer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, weak) UIView *renderView;
|
||||||
|
@property (nonatomic, weak) UIActivityIndicatorView *activityView;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation VideoView
|
||||||
|
|
||||||
|
@synthesize videoOrientation = _videoOrientation;
|
||||||
|
@synthesize isRemote = _isRemote;
|
||||||
|
@synthesize renderView = _renderView;
|
||||||
|
@synthesize activityView = _activityView;
|
||||||
|
|
||||||
|
static void init(VideoView *self) {
|
||||||
|
UIView *renderView = [RTCVideoRenderer newRenderViewWithFrame:
|
||||||
|
CGRectMake(0,
|
||||||
|
0,
|
||||||
|
self.bounds.size.width,
|
||||||
|
self.bounds.size.height)];
|
||||||
|
[self addSubview:renderView];
|
||||||
|
renderView.autoresizingMask = UIViewAutoresizingFlexibleHeight |
|
||||||
|
UIViewAutoresizingFlexibleWidth;
|
||||||
|
renderView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||||
|
self.renderView = renderView;
|
||||||
|
|
||||||
|
UIActivityIndicatorView *indicatorView =
|
||||||
|
[[UIActivityIndicatorView alloc]
|
||||||
|
initWithActivityIndicatorStyle:
|
||||||
|
UIActivityIndicatorViewStyleWhiteLarge];
|
||||||
|
indicatorView.frame = self.bounds;
|
||||||
|
indicatorView.hidesWhenStopped = YES;
|
||||||
|
[self addSubview:indicatorView];
|
||||||
|
indicatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth |
|
||||||
|
UIViewAutoresizingFlexibleHeight;
|
||||||
|
indicatorView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||||
|
[indicatorView startAnimating];
|
||||||
|
self.activityView = indicatorView;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithFrame:(CGRect)frame {
|
||||||
|
self = [super initWithFrame:frame];
|
||||||
|
if (self) {
|
||||||
|
init(self);
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(id)initWithCoder:(NSCoder *)aDecoder {
|
||||||
|
self = [super initWithCoder:aDecoder];
|
||||||
|
if (self) {
|
||||||
|
init(self);
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (UIInterfaceOrientation)videoOrientation {
|
||||||
|
return _videoOrientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setVideoOrientation:(UIInterfaceOrientation)videoOrientation {
|
||||||
|
if (_videoOrientation != videoOrientation) {
|
||||||
|
_videoOrientation = videoOrientation;
|
||||||
|
|
||||||
|
CGFloat angle;
|
||||||
|
switch (videoOrientation) {
|
||||||
|
case UIInterfaceOrientationPortrait:
|
||||||
|
angle = M_PI_2;
|
||||||
|
break;
|
||||||
|
case UIInterfaceOrientationPortraitUpsideDown:
|
||||||
|
angle = -M_PI_2;
|
||||||
|
break;
|
||||||
|
case UIInterfaceOrientationLandscapeLeft:
|
||||||
|
angle = M_PI;
|
||||||
|
break;
|
||||||
|
case UIInterfaceOrientationLandscapeRight:
|
||||||
|
angle = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// The video comes in mirrored. That is fine for the local video,
|
||||||
|
// but the remote video should be put back to original.
|
||||||
|
CGAffineTransform xform =
|
||||||
|
CGAffineTransformMakeScale([self isRemote] ? -1 : 1, 1);
|
||||||
|
xform = CGAffineTransformRotate(xform, angle);
|
||||||
|
[[self renderView] setTransform:xform];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)renderVideoTrackInterface:(RTCVideoTrack *)videoTrack {
|
||||||
|
[self stop];
|
||||||
|
|
||||||
|
_track = videoTrack;
|
||||||
|
|
||||||
|
if (_track) {
|
||||||
|
if (!_renderer) {
|
||||||
|
_renderer = [[RTCVideoRenderer alloc]
|
||||||
|
initWithRenderView:[self renderView]];
|
||||||
|
}
|
||||||
|
[_track addRenderer:_renderer];
|
||||||
|
[self resume];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self setVideoOrientation:UIInterfaceOrientationLandscapeLeft];
|
||||||
|
[self setVideoOrientation:UIInterfaceOrientationPortrait];
|
||||||
|
[self setVideoOrientation:UIInterfaceOrientationLandscapeLeft];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)pause {
|
||||||
|
[_renderer stop];
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void)resume {
|
||||||
|
[self.activityView stopAnimating];
|
||||||
|
[self.activityView removeFromSuperview];
|
||||||
|
self.activityView = nil;
|
||||||
|
|
||||||
|
[_renderer start];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)stop {
|
||||||
|
[_track removeRenderer:_renderer];
|
||||||
|
[_renderer stop];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
|
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
|
||||||
<data>
|
<data>
|
||||||
<int key="IBDocument.SystemTarget">1552</int>
|
<int key="IBDocument.SystemTarget">1536</int>
|
||||||
<string key="IBDocument.SystemVersion">12D78</string>
|
<string key="IBDocument.SystemVersion">13B42</string>
|
||||||
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
|
<string key="IBDocument.InterfaceBuilderVersion">4514</string>
|
||||||
<string key="IBDocument.AppKitVersion">1187.37</string>
|
<string key="IBDocument.AppKitVersion">1265</string>
|
||||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
<string key="IBDocument.HIToolboxVersion">696.00</string>
|
||||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||||
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="NS.object.0">2083</string>
|
<string key="NS.object.0">3747</string>
|
||||||
</object>
|
</object>
|
||||||
<array key="IBDocument.IntegratedClassDependencies">
|
<array key="IBDocument.IntegratedClassDependencies">
|
||||||
<string>IBNSLayoutConstraint</string>
|
<string>IBNSLayoutConstraint</string>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBUIView" id="774585933">
|
<object class="IBUIView" id="774585933">
|
||||||
<nil key="NSNextResponder"/>
|
<reference key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">274</int>
|
<int key="NSvFlags">274</int>
|
||||||
<array class="NSMutableArray" key="NSSubviews">
|
<array class="NSMutableArray" key="NSSubviews">
|
||||||
<object class="IBUITextView" id="176994284">
|
<object class="IBUITextView" id="176994284">
|
||||||
@@ -42,7 +42,8 @@
|
|||||||
<int key="NSvFlags">292</int>
|
<int key="NSvFlags">292</int>
|
||||||
<string key="NSFrame">{{20, 20}, {280, 141}}</string>
|
<string key="NSFrame">{{20, 20}, {280, 141}}</string>
|
||||||
<reference key="NSSuperview" ref="774585933"/>
|
<reference key="NSSuperview" ref="774585933"/>
|
||||||
<reference key="NSNextKeyView" ref="546385578"/>
|
<reference key="NSWindow"/>
|
||||||
|
<reference key="NSNextKeyView" ref="634862110"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<object class="NSColor" key="IBUIBackgroundColor" id="621995359">
|
<object class="NSColor" key="IBUIBackgroundColor" id="621995359">
|
||||||
<int key="NSColorSpace">1</int>
|
<int key="NSColorSpace">1</int>
|
||||||
@@ -60,8 +61,8 @@
|
|||||||
<int key="type">1</int>
|
<int key="type">1</int>
|
||||||
<double key="pointSize">14</double>
|
<double key="pointSize">14</double>
|
||||||
</object>
|
</object>
|
||||||
<object class="NSFont" key="IBUIFont" id="371333696">
|
<object class="NSFont" key="IBUIFont" id="144501234">
|
||||||
<string key="NSName">Helvetica</string>
|
<string key="NSName">HelveticaNeue</string>
|
||||||
<double key="NSSize">14</double>
|
<double key="NSSize">14</double>
|
||||||
<int key="NSfFlags">16</int>
|
<int key="NSfFlags">16</int>
|
||||||
</object>
|
</object>
|
||||||
@@ -71,7 +72,8 @@
|
|||||||
<int key="NSvFlags">292</int>
|
<int key="NSvFlags">292</int>
|
||||||
<string key="NSFrame">{{20, 180}, {280, 30}}</string>
|
<string key="NSFrame">{{20, 180}, {280, 30}}</string>
|
||||||
<reference key="NSSuperview" ref="774585933"/>
|
<reference key="NSSuperview" ref="774585933"/>
|
||||||
<reference key="NSNextKeyView" ref="634862110"/>
|
<reference key="NSWindow"/>
|
||||||
|
<reference key="NSNextKeyView" ref="261050959"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<bool key="IBUIOpaque">NO</bool>
|
<bool key="IBUIOpaque">NO</bool>
|
||||||
<bool key="IBUIClipsSubviews">YES</bool>
|
<bool key="IBUIClipsSubviews">YES</bool>
|
||||||
@@ -95,13 +97,15 @@
|
|||||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||||
</object>
|
</object>
|
||||||
<reference key="IBUIFontDescription" ref="166497611"/>
|
<reference key="IBUIFontDescription" ref="166497611"/>
|
||||||
<reference key="IBUIFont" ref="371333696"/>
|
<reference key="IBUIFont" ref="144501234"/>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBUITextView" id="634862110">
|
<object class="IBUITextView" id="634862110">
|
||||||
<reference key="NSNextResponder" ref="774585933"/>
|
<reference key="NSNextResponder" ref="774585933"/>
|
||||||
<int key="NSvFlags">-2147483356</int>
|
<int key="NSvFlags">-2147483356</int>
|
||||||
<string key="NSFrame">{{20, 20}, {280, 508}}</string>
|
<string key="NSFrame">{{20, 20}, {280, 190}}</string>
|
||||||
<reference key="NSSuperview" ref="774585933"/>
|
<reference key="NSSuperview" ref="774585933"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
|
<reference key="NSNextKeyView" ref="546385578"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<reference key="IBUIBackgroundColor" ref="621995359"/>
|
<reference key="IBUIBackgroundColor" ref="621995359"/>
|
||||||
<bool key="IBUIClipsSubviews">YES</bool>
|
<bool key="IBUIClipsSubviews">YES</bool>
|
||||||
@@ -114,10 +118,26 @@
|
|||||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||||
</object>
|
</object>
|
||||||
<reference key="IBUIFontDescription" ref="166497611"/>
|
<reference key="IBUIFontDescription" ref="166497611"/>
|
||||||
<reference key="IBUIFont" ref="371333696"/>
|
<reference key="IBUIFont" ref="144501234"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBUIView" id="261050959">
|
||||||
|
<reference key="NSNextResponder" ref="774585933"/>
|
||||||
|
<int key="NSvFlags">-2147483356</int>
|
||||||
|
<string key="NSFrame">{{20, 228}, {280, 300}}</string>
|
||||||
|
<reference key="NSSuperview" ref="774585933"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
|
<reference key="NSNextKeyView"/>
|
||||||
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
|
<object class="NSColor" key="IBUIBackgroundColor">
|
||||||
|
<int key="NSColorSpace">3</int>
|
||||||
|
<bytes key="NSWhite">MAA</bytes>
|
||||||
|
</object>
|
||||||
|
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrame">{{0, 20}, {320, 548}}</string>
|
<string key="NSFrame">{{0, 20}, {320, 548}}</string>
|
||||||
|
<reference key="NSSuperview"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="176994284"/>
|
<reference key="NSNextKeyView" ref="176994284"/>
|
||||||
<object class="NSColor" key="IBUIBackgroundColor">
|
<object class="NSColor" key="IBUIBackgroundColor">
|
||||||
<int key="NSColorSpace">3</int>
|
<int key="NSColorSpace">3</int>
|
||||||
@@ -140,7 +160,7 @@
|
|||||||
</array>
|
</array>
|
||||||
</object>
|
</object>
|
||||||
<string key="IBUITargetRuntime">IBCocoaTouchFramework</string>
|
<string key="IBUITargetRuntime">IBCocoaTouchFramework</string>
|
||||||
<string key="IBUIDisplayName">Retina 4 Full Screen</string>
|
<string key="IBUIDisplayName">Retina 4-inch Full Screen</string>
|
||||||
<int key="IBUIType">2</int>
|
<int key="IBUIType">2</int>
|
||||||
</object>
|
</object>
|
||||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||||
@@ -180,6 +200,14 @@
|
|||||||
</object>
|
</object>
|
||||||
<int key="connectionID">138</int>
|
<int key="connectionID">138</int>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="IBConnectionRecord">
|
||||||
|
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||||
|
<string key="label">blackView</string>
|
||||||
|
<reference key="source" ref="372490531"/>
|
||||||
|
<reference key="destination" ref="261050959"/>
|
||||||
|
</object>
|
||||||
|
<int key="connectionID">151</int>
|
||||||
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||||
<array key="orderedObjects">
|
<array key="orderedObjects">
|
||||||
@@ -204,6 +232,74 @@
|
|||||||
<int key="objectID">6</int>
|
<int key="objectID">6</int>
|
||||||
<reference key="object" ref="774585933"/>
|
<reference key="object" ref="774585933"/>
|
||||||
<array class="NSMutableArray" key="children">
|
<array class="NSMutableArray" key="children">
|
||||||
|
<object class="IBNSLayoutConstraint" id="933872207">
|
||||||
|
<reference key="firstItem" ref="774585933"/>
|
||||||
|
<int key="firstAttribute">4</int>
|
||||||
|
<int key="relation">0</int>
|
||||||
|
<reference key="secondItem" ref="261050959"/>
|
||||||
|
<int key="secondAttribute">4</int>
|
||||||
|
<float key="multiplier">1</float>
|
||||||
|
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
||||||
|
<double key="value">20</double>
|
||||||
|
</object>
|
||||||
|
<float key="priority">1000</float>
|
||||||
|
<reference key="containingView" ref="774585933"/>
|
||||||
|
<int key="scoringType">8</int>
|
||||||
|
<float key="scoringTypeFloat">23</float>
|
||||||
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
|
</object>
|
||||||
|
<object class="IBNSLayoutConstraint" id="863471211">
|
||||||
|
<reference key="firstItem" ref="261050959"/>
|
||||||
|
<int key="firstAttribute">3</int>
|
||||||
|
<int key="relation">0</int>
|
||||||
|
<reference key="secondItem" ref="774585933"/>
|
||||||
|
<int key="secondAttribute">3</int>
|
||||||
|
<float key="multiplier">1</float>
|
||||||
|
<object class="IBLayoutConstant" key="constant">
|
||||||
|
<double key="value">228</double>
|
||||||
|
</object>
|
||||||
|
<float key="priority">1000</float>
|
||||||
|
<reference key="containingView" ref="774585933"/>
|
||||||
|
<int key="scoringType">3</int>
|
||||||
|
<float key="scoringTypeFloat">9</float>
|
||||||
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
|
</object>
|
||||||
|
<object class="IBNSLayoutConstraint" id="590654550">
|
||||||
|
<reference key="firstItem" ref="546385578"/>
|
||||||
|
<int key="firstAttribute">5</int>
|
||||||
|
<int key="relation">0</int>
|
||||||
|
<reference key="secondItem" ref="261050959"/>
|
||||||
|
<int key="secondAttribute">5</int>
|
||||||
|
<float key="multiplier">1</float>
|
||||||
|
<object class="IBLayoutConstant" key="constant">
|
||||||
|
<double key="value">0.0</double>
|
||||||
|
</object>
|
||||||
|
<float key="priority">1000</float>
|
||||||
|
<reference key="containingView" ref="774585933"/>
|
||||||
|
<int key="scoringType">6</int>
|
||||||
|
<float key="scoringTypeFloat">24</float>
|
||||||
|
<int key="contentType">2</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
|
</object>
|
||||||
|
<object class="IBNSLayoutConstraint" id="734153049">
|
||||||
|
<reference key="firstItem" ref="546385578"/>
|
||||||
|
<int key="firstAttribute">6</int>
|
||||||
|
<int key="relation">0</int>
|
||||||
|
<reference key="secondItem" ref="261050959"/>
|
||||||
|
<int key="secondAttribute">6</int>
|
||||||
|
<float key="multiplier">1</float>
|
||||||
|
<object class="IBLayoutConstant" key="constant">
|
||||||
|
<double key="value">0.0</double>
|
||||||
|
</object>
|
||||||
|
<float key="priority">1000</float>
|
||||||
|
<reference key="containingView" ref="774585933"/>
|
||||||
|
<int key="scoringType">6</int>
|
||||||
|
<float key="scoringTypeFloat">24</float>
|
||||||
|
<int key="contentType">2</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="117610664">
|
<object class="IBNSLayoutConstraint" id="117610664">
|
||||||
<reference key="firstItem" ref="774585933"/>
|
<reference key="firstItem" ref="774585933"/>
|
||||||
<int key="firstAttribute">6</int>
|
<int key="firstAttribute">6</int>
|
||||||
@@ -216,25 +312,10 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
</object>
|
<bool key="placeholder">NO</bool>
|
||||||
<object class="IBNSLayoutConstraint" id="555801739">
|
|
||||||
<reference key="firstItem" ref="546385578"/>
|
|
||||||
<int key="firstAttribute">3</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="774585933"/>
|
|
||||||
<int key="secondAttribute">3</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">180</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="774585933"/>
|
|
||||||
<int key="scoringType">3</int>
|
|
||||||
<float key="scoringTypeFloat">9</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="860801955">
|
<object class="IBNSLayoutConstraint" id="860801955">
|
||||||
<reference key="firstItem" ref="546385578"/>
|
<reference key="firstItem" ref="546385578"/>
|
||||||
@@ -248,9 +329,27 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
|
</object>
|
||||||
|
<object class="IBNSLayoutConstraint" id="544488581">
|
||||||
|
<reference key="firstItem" ref="634862110"/>
|
||||||
|
<int key="firstAttribute">4</int>
|
||||||
|
<int key="relation">0</int>
|
||||||
|
<reference key="secondItem" ref="546385578"/>
|
||||||
|
<int key="secondAttribute">4</int>
|
||||||
|
<float key="multiplier">1</float>
|
||||||
|
<object class="IBLayoutConstant" key="constant">
|
||||||
|
<double key="value">0.0</double>
|
||||||
|
</object>
|
||||||
|
<float key="priority">1000</float>
|
||||||
|
<reference key="containingView" ref="774585933"/>
|
||||||
|
<int key="scoringType">6</int>
|
||||||
|
<float key="scoringTypeFloat">24</float>
|
||||||
|
<int key="contentType">2</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="19985792">
|
<object class="IBNSLayoutConstraint" id="19985792">
|
||||||
<reference key="firstItem" ref="634862110"/>
|
<reference key="firstItem" ref="634862110"/>
|
||||||
@@ -264,9 +363,10 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="1001701893">
|
<object class="IBNSLayoutConstraint" id="1001701893">
|
||||||
<reference key="firstItem" ref="774585933"/>
|
<reference key="firstItem" ref="774585933"/>
|
||||||
@@ -280,25 +380,10 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="914503793">
|
|
||||||
<reference key="firstItem" ref="774585933"/>
|
|
||||||
<int key="firstAttribute">4</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="634862110"/>
|
|
||||||
<int key="secondAttribute">4</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">20</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="774585933"/>
|
|
||||||
<int key="scoringType">8</int>
|
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="858545289">
|
<object class="IBNSLayoutConstraint" id="858545289">
|
||||||
<reference key="firstItem" ref="634862110"/>
|
<reference key="firstItem" ref="634862110"/>
|
||||||
@@ -312,9 +397,10 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="1039342825">
|
<object class="IBNSLayoutConstraint" id="1039342825">
|
||||||
<reference key="firstItem" ref="774585933"/>
|
<reference key="firstItem" ref="774585933"/>
|
||||||
@@ -328,9 +414,10 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="663764352">
|
<object class="IBNSLayoutConstraint" id="663764352">
|
||||||
<reference key="firstItem" ref="176994284"/>
|
<reference key="firstItem" ref="176994284"/>
|
||||||
@@ -344,9 +431,10 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBNSLayoutConstraint" id="46028745">
|
<object class="IBNSLayoutConstraint" id="46028745">
|
||||||
<reference key="firstItem" ref="176994284"/>
|
<reference key="firstItem" ref="176994284"/>
|
||||||
@@ -360,13 +448,15 @@
|
|||||||
</object>
|
</object>
|
||||||
<float key="priority">1000</float>
|
<float key="priority">1000</float>
|
||||||
<reference key="containingView" ref="774585933"/>
|
<reference key="containingView" ref="774585933"/>
|
||||||
<int key="scoringType">8</int>
|
<int key="scoringType">0</int>
|
||||||
<float key="scoringTypeFloat">29</float>
|
<float key="scoringTypeFloat">29</float>
|
||||||
<int key="contentType">3</int>
|
<int key="contentType">3</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
<reference ref="176994284"/>
|
<reference ref="176994284"/>
|
||||||
<reference ref="546385578"/>
|
<reference ref="546385578"/>
|
||||||
<reference ref="634862110"/>
|
<reference ref="634862110"/>
|
||||||
|
<reference ref="261050959"/>
|
||||||
</array>
|
</array>
|
||||||
<reference key="parent" ref="0"/>
|
<reference key="parent" ref="0"/>
|
||||||
</object>
|
</object>
|
||||||
@@ -389,6 +479,7 @@
|
|||||||
<int key="scoringType">3</int>
|
<int key="scoringType">3</int>
|
||||||
<float key="scoringTypeFloat">9</float>
|
<float key="scoringTypeFloat">9</float>
|
||||||
<int key="contentType">1</int>
|
<int key="contentType">1</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<reference key="parent" ref="774585933"/>
|
<reference key="parent" ref="774585933"/>
|
||||||
@@ -424,11 +515,6 @@
|
|||||||
<reference key="object" ref="234302232"/>
|
<reference key="object" ref="234302232"/>
|
||||||
<reference key="parent" ref="176994284"/>
|
<reference key="parent" ref="176994284"/>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">124</int>
|
|
||||||
<reference key="object" ref="555801739"/>
|
|
||||||
<reference key="parent" ref="774585933"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
<object class="IBObjectRecord">
|
||||||
<int key="objectID">126</int>
|
<int key="objectID">126</int>
|
||||||
<reference key="object" ref="117610664"/>
|
<reference key="object" ref="117610664"/>
|
||||||
@@ -437,7 +523,25 @@
|
|||||||
<object class="IBObjectRecord">
|
<object class="IBObjectRecord">
|
||||||
<int key="objectID">128</int>
|
<int key="objectID">128</int>
|
||||||
<reference key="object" ref="634862110"/>
|
<reference key="object" ref="634862110"/>
|
||||||
<array class="NSMutableArray" key="children"/>
|
<array class="NSMutableArray" key="children">
|
||||||
|
<object class="IBNSLayoutConstraint" id="988159807">
|
||||||
|
<reference key="firstItem" ref="634862110"/>
|
||||||
|
<int key="firstAttribute">8</int>
|
||||||
|
<int key="relation">0</int>
|
||||||
|
<nil key="secondItem"/>
|
||||||
|
<int key="secondAttribute">0</int>
|
||||||
|
<float key="multiplier">1</float>
|
||||||
|
<object class="IBLayoutConstant" key="constant">
|
||||||
|
<double key="value">190</double>
|
||||||
|
</object>
|
||||||
|
<float key="priority">1000</float>
|
||||||
|
<reference key="containingView" ref="634862110"/>
|
||||||
|
<int key="scoringType">3</int>
|
||||||
|
<float key="scoringTypeFloat">9</float>
|
||||||
|
<int key="contentType">1</int>
|
||||||
|
<bool key="placeholder">NO</bool>
|
||||||
|
</object>
|
||||||
|
</array>
|
||||||
<reference key="parent" ref="774585933"/>
|
<reference key="parent" ref="774585933"/>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBObjectRecord">
|
<object class="IBObjectRecord">
|
||||||
@@ -445,11 +549,6 @@
|
|||||||
<reference key="object" ref="858545289"/>
|
<reference key="object" ref="858545289"/>
|
||||||
<reference key="parent" ref="774585933"/>
|
<reference key="parent" ref="774585933"/>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">136</int>
|
|
||||||
<reference key="object" ref="914503793"/>
|
|
||||||
<reference key="parent" ref="774585933"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
<object class="IBObjectRecord">
|
||||||
<int key="objectID">137</int>
|
<int key="objectID">137</int>
|
||||||
<reference key="object" ref="1001701893"/>
|
<reference key="object" ref="1001701893"/>
|
||||||
@@ -460,6 +559,41 @@
|
|||||||
<reference key="object" ref="19985792"/>
|
<reference key="object" ref="19985792"/>
|
||||||
<reference key="parent" ref="774585933"/>
|
<reference key="parent" ref="774585933"/>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">141</int>
|
||||||
|
<reference key="object" ref="988159807"/>
|
||||||
|
<reference key="parent" ref="634862110"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">142</int>
|
||||||
|
<reference key="object" ref="261050959"/>
|
||||||
|
<reference key="parent" ref="774585933"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">148</int>
|
||||||
|
<reference key="object" ref="734153049"/>
|
||||||
|
<reference key="parent" ref="774585933"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">149</int>
|
||||||
|
<reference key="object" ref="590654550"/>
|
||||||
|
<reference key="parent" ref="774585933"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">153</int>
|
||||||
|
<reference key="object" ref="863471211"/>
|
||||||
|
<reference key="parent" ref="774585933"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">154</int>
|
||||||
|
<reference key="object" ref="933872207"/>
|
||||||
|
<reference key="parent" ref="774585933"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">155</int>
|
||||||
|
<reference key="object" ref="544488581"/>
|
||||||
|
<reference key="parent" ref="774585933"/>
|
||||||
|
</object>
|
||||||
</array>
|
</array>
|
||||||
</object>
|
</object>
|
||||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||||
@@ -471,31 +605,43 @@
|
|||||||
<boolean value="NO" key="104.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
<boolean value="NO" key="104.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||||
<string key="107.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="107.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="123.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="123.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="124.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
|
||||||
<string key="126.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="126.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="128.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="128.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<array key="128.IBViewMetadataConstraints">
|
||||||
|
<reference ref="988159807"/>
|
||||||
|
</array>
|
||||||
<boolean value="NO" key="128.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
<boolean value="NO" key="128.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||||
<string key="133.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="133.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="136.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
|
||||||
<string key="137.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="137.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="139.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="139.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<string key="141.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<string key="142.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<boolean value="NO" key="142.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||||
|
<string key="148.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<string key="149.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<string key="153.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<string key="154.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
|
<string key="155.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="57.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="57.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<array class="NSMutableArray" key="57.IBViewMetadataConstraints">
|
<array class="NSMutableArray" key="57.IBViewMetadataConstraints">
|
||||||
<reference ref="234302232"/>
|
<reference ref="234302232"/>
|
||||||
</array>
|
</array>
|
||||||
<boolean value="NO" key="57.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
<boolean value="NO" key="57.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
||||||
<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<array key="6.IBViewMetadataConstraints">
|
<array class="NSMutableArray" key="6.IBViewMetadataConstraints">
|
||||||
<reference ref="46028745"/>
|
<reference ref="46028745"/>
|
||||||
<reference ref="663764352"/>
|
<reference ref="663764352"/>
|
||||||
<reference ref="1039342825"/>
|
<reference ref="1039342825"/>
|
||||||
<reference ref="858545289"/>
|
<reference ref="858545289"/>
|
||||||
<reference ref="914503793"/>
|
|
||||||
<reference ref="1001701893"/>
|
<reference ref="1001701893"/>
|
||||||
<reference ref="19985792"/>
|
<reference ref="19985792"/>
|
||||||
|
<reference ref="544488581"/>
|
||||||
<reference ref="860801955"/>
|
<reference ref="860801955"/>
|
||||||
<reference ref="555801739"/>
|
|
||||||
<reference ref="117610664"/>
|
<reference ref="117610664"/>
|
||||||
|
<reference ref="734153049"/>
|
||||||
|
<reference ref="590654550"/>
|
||||||
|
<reference ref="863471211"/>
|
||||||
|
<reference ref="933872207"/>
|
||||||
</array>
|
</array>
|
||||||
<string key="62.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="62.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
<string key="63.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
<string key="63.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||||
@@ -505,10 +651,42 @@
|
|||||||
<nil key="activeLocalization"/>
|
<nil key="activeLocalization"/>
|
||||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||||
<nil key="sourceID"/>
|
<nil key="sourceID"/>
|
||||||
<int key="maxID">139</int>
|
<int key="maxID">155</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">APPRTCViewController</string>
|
||||||
|
<string key="superclassName">UIViewController</string>
|
||||||
|
<dictionary class="NSMutableDictionary" key="outlets">
|
||||||
|
<string key="blackView">UIView</string>
|
||||||
|
<string key="textField">UITextField</string>
|
||||||
|
<string key="textInstructions">UITextView</string>
|
||||||
|
<string key="textOutput">UITextView</string>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||||
|
<object class="IBToOneOutletInfo" key="blackView">
|
||||||
|
<string key="name">blackView</string>
|
||||||
|
<string key="candidateClassName">UIView</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="textField">
|
||||||
|
<string key="name">textField</string>
|
||||||
|
<string key="candidateClassName">UITextField</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="textInstructions">
|
||||||
|
<string key="name">textInstructions</string>
|
||||||
|
<string key="candidateClassName">UITextView</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="textOutput">
|
||||||
|
<string key="name">textOutput</string>
|
||||||
|
<string key="candidateClassName">UITextView</string>
|
||||||
|
</object>
|
||||||
|
</dictionary>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">./Classes/APPRTCViewController.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
<object class="IBPartialClassDescription">
|
<object class="IBPartialClassDescription">
|
||||||
<string key="className">NSLayoutConstraint</string>
|
<string key="className">NSLayoutConstraint</string>
|
||||||
<string key="superclassName">NSObject</string>
|
<string key="superclassName">NSObject</string>
|
||||||
@@ -521,9 +699,18 @@
|
|||||||
</object>
|
</object>
|
||||||
<int key="IBDocument.localizationMode">0</int>
|
<int key="IBDocument.localizationMode">0</int>
|
||||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||||
|
<bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">YES</bool>
|
||||||
|
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
|
||||||
|
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
|
||||||
|
<real value="1536" key="NS.object.0"/>
|
||||||
|
</object>
|
||||||
|
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
|
||||||
|
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
|
||||||
|
<integer value="4600" key="NS.object.0"/>
|
||||||
|
</object>
|
||||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||||
<bool key="IBDocument.UseAutolayout">YES</bool>
|
<bool key="IBDocument.UseAutolayout">YES</bool>
|
||||||
<string key="IBCocoaTouchPluginVersion">2083</string>
|
<string key="IBCocoaTouchPluginVersion">3747</string>
|
||||||
</data>
|
</data>
|
||||||
</archive>
|
</archive>
|
||||||
|
@@ -251,12 +251,15 @@
|
|||||||
'examples/ios/AppRTCDemo/AppRTCDemo-Prefix.pch',
|
'examples/ios/AppRTCDemo/AppRTCDemo-Prefix.pch',
|
||||||
'examples/ios/AppRTCDemo/GAEChannelClient.h',
|
'examples/ios/AppRTCDemo/GAEChannelClient.h',
|
||||||
'examples/ios/AppRTCDemo/GAEChannelClient.m',
|
'examples/ios/AppRTCDemo/GAEChannelClient.m',
|
||||||
|
'examples/ios/AppRTCDemo/VideoView.h',
|
||||||
|
'examples/ios/AppRTCDemo/VideoView.m',
|
||||||
'examples/ios/AppRTCDemo/main.m',
|
'examples/ios/AppRTCDemo/main.m',
|
||||||
],
|
],
|
||||||
'xcode_settings': {
|
'xcode_settings': {
|
||||||
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
||||||
'INFOPLIST_FILE': 'examples/ios/AppRTCDemo/Info.plist',
|
'INFOPLIST_FILE': 'examples/ios/AppRTCDemo/Info.plist',
|
||||||
'OTHER_LDFLAGS': [
|
'OTHER_LDFLAGS': [
|
||||||
|
'-framework CoreGraphics',
|
||||||
'-framework Foundation',
|
'-framework Foundation',
|
||||||
'-framework UIKit',
|
'-framework UIKit',
|
||||||
],
|
],
|
||||||
|
@@ -39,8 +39,6 @@
|
|||||||
#include "talk/media/devices/filevideocapturer.h"
|
#include "talk/media/devices/filevideocapturer.h"
|
||||||
#include "talk/media/devices/yuvframescapturer.h"
|
#include "talk/media/devices/yuvframescapturer.h"
|
||||||
|
|
||||||
#if !defined(IOS)
|
|
||||||
|
|
||||||
#if defined(HAVE_WEBRTC_VIDEO)
|
#if defined(HAVE_WEBRTC_VIDEO)
|
||||||
#include "talk/media/webrtc/webrtcvideocapturer.h"
|
#include "talk/media/webrtc/webrtcvideocapturer.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -51,8 +49,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool StringMatchWithWildcard(
|
bool StringMatchWithWildcard(
|
||||||
@@ -216,10 +212,6 @@ void DeviceManager::ClearVideoCaptureDeviceMaxFormat(
|
|||||||
}
|
}
|
||||||
|
|
||||||
VideoCapturer* DeviceManager::CreateVideoCapturer(const Device& device) const {
|
VideoCapturer* DeviceManager::CreateVideoCapturer(const Device& device) const {
|
||||||
#if defined(IOS)
|
|
||||||
LOG_F(LS_ERROR) << " should never be called!";
|
|
||||||
return NULL;
|
|
||||||
#else
|
|
||||||
VideoCapturer* capturer = ConstructFakeVideoCapturer(device);
|
VideoCapturer* capturer = ConstructFakeVideoCapturer(device);
|
||||||
if (capturer) {
|
if (capturer) {
|
||||||
return capturer;
|
return capturer;
|
||||||
@@ -237,7 +229,6 @@ VideoCapturer* DeviceManager::CreateVideoCapturer(const Device& device) const {
|
|||||||
capturer->ConstrainSupportedFormats(video_format);
|
capturer->ConstrainSupportedFormats(video_format);
|
||||||
}
|
}
|
||||||
return capturer;
|
return capturer;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoCapturer* DeviceManager::ConstructFakeVideoCapturer(
|
VideoCapturer* DeviceManager::ConstructFakeVideoCapturer(
|
||||||
|
@@ -190,11 +190,15 @@ bool WebRtcVideoCapturer::Init(const Device& device) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
factory_->DestroyDeviceInfo(info);
|
factory_->DestroyDeviceInfo(info);
|
||||||
|
// TODO(fischman): Remove the following check
|
||||||
|
// when capabilities for iOS are implemented
|
||||||
|
// https://code.google.com/p/webrtc/issues/detail?id=2968
|
||||||
|
#if !defined(IOS)
|
||||||
if (supported.empty()) {
|
if (supported.empty()) {
|
||||||
LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id;
|
LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
module_ = factory_->Create(0, vcm_id);
|
module_ = factory_->Create(0, vcm_id);
|
||||||
if (!module_) {
|
if (!module_) {
|
||||||
LOG(LS_ERROR) << "Failed to create capturer for id: " << device.id;
|
LOG(LS_ERROR) << "Failed to create capturer for id: " << device.id;
|
||||||
|
Reference in New Issue
Block a user