summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authortkchin@webrtc.org <tkchin@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-05-19 23:26:01 +0000
committertkchin@webrtc.org <tkchin@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-05-19 23:26:01 +0000
commit935b8f2c093115e48d105962c5f403a5c8e76f7e (patch)
tree66f17b9aa9364fb97e791a8323a72bd2088f8b67 /examples
parent934c903260219294669b37f08d3c67fc6a033722 (diff)
downloadtalk-935b8f2c093115e48d105962c5f403a5c8e76f7e.tar.gz
Add a UIView for rendering a video track.
RTCEAGLVideoView provides functionality to render a supplied RTCVideoTrack using OpenGLES2. R=fischman@webrtc.org BUG=3188 Review URL: https://webrtc-codereview.appspot.com/12489004 git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@6192 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'examples')
-rw-r--r--examples/ios/AppRTCDemo/APPRTCAppDelegate.m14
-rw-r--r--examples/ios/AppRTCDemo/APPRTCVideoView.h43
-rw-r--r--examples/ios/AppRTCDemo/APPRTCVideoView.m82
-rw-r--r--examples/ios/AppRTCDemo/APPRTCViewController.h6
-rw-r--r--examples/ios/AppRTCDemo/APPRTCViewController.m74
-rw-r--r--examples/ios/AppRTCDemo/Info.plist2
6 files changed, 36 insertions, 185 deletions
diff --git a/examples/ios/AppRTCDemo/APPRTCAppDelegate.m b/examples/ios/AppRTCDemo/APPRTCAppDelegate.m
index cc33f03..87d1f53 100644
--- a/examples/ios/AppRTCDemo/APPRTCAppDelegate.m
+++ b/examples/ios/AppRTCDemo/APPRTCAppDelegate.m
@@ -30,6 +30,7 @@
#import "APPRTCAppDelegate.h"
#import "APPRTCViewController.h"
+#import "RTCEAGLVideoView.h"
#import "RTCICECandidate.h"
#import "RTCICEServer.h"
#import "RTCMediaConstraints.h"
@@ -43,13 +44,12 @@
#import "RTCVideoRenderer.h"
#import "RTCVideoCapturer.h"
#import "RTCVideoTrack.h"
-#import "APPRTCVideoView.h"
@interface PCObserver : NSObject<RTCPeerConnectionDelegate>
- (id)initWithDelegate:(id<APPRTCSendMessage>)delegate;
-@property(nonatomic, strong) APPRTCVideoView* videoView;
+@property(nonatomic, strong) RTCEAGLVideoView* videoView;
@end
@@ -89,8 +89,7 @@
NSAssert([stream.videoTracks count] <= 1,
@"Expected at most 1 video stream");
if ([stream.videoTracks count] != 0) {
- [self.videoView
- renderVideoTrackInterface:[stream.videoTracks objectAtIndex:0]];
+ self.videoView.videoTrack = stream.videoTracks[0];
}
});
}
@@ -291,13 +290,12 @@
if (localVideoTrack) {
[lms addVideoTrack:localVideoTrack];
}
+ self.viewController.localVideoView.videoTrack = localVideoTrack;
+#else
+ self.viewController.localVideoView.hidden = YES;
#endif
- [self.viewController.localVideoView
- renderVideoTrackInterface:localVideoTrack];
-
self.pcObserver.videoView = self.viewController.remoteVideoView;
-
[lms addAudioTrack:[self.peerConnectionFactory audioTrackWithID:@"ARDAMSa0"]];
[self.peerConnection addStream:lms constraints:constraints];
[self displayLogMessage:@"onICEServers - added local stream."];
diff --git a/examples/ios/AppRTCDemo/APPRTCVideoView.h b/examples/ios/AppRTCDemo/APPRTCVideoView.h
deleted file mode 100644
index 238798e..0000000
--- a/examples/ios/AppRTCDemo/APPRTCVideoView.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 APPRTCVideoView : 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;
-
-@end
diff --git a/examples/ios/AppRTCDemo/APPRTCVideoView.m b/examples/ios/AppRTCDemo/APPRTCVideoView.m
deleted file mode 100644
index 23466b6..0000000
--- a/examples/ios/AppRTCDemo/APPRTCVideoView.m
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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 APPRTCVideoView 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 "APPRTCVideoView.h"
-
-#import "RTCVideoRenderer.h"
-#import "RTCVideoTrack.h"
-
-@interface APPRTCVideoView () {
- RTCVideoTrack* _track;
- RTCVideoRenderer* _renderer;
-}
-
-@property(nonatomic, weak) UIView* renderView;
-@property(nonatomic, weak) UIActivityIndicatorView* activityView;
-
-@end
-
-@implementation APPRTCVideoView
-
-@synthesize videoOrientation = _videoOrientation;
-
-- (void)layoutSubviews {
- [super layoutSubviews];
- if (!_renderer) {
- // Left-right (mirror) flip the remote view.
- CGAffineTransform xform =
- CGAffineTransformMakeScale(self.isRemote ? -1 : 1, 1);
- // TODO(fischman): why is this rotate (vertical+horizontal flip) needed?!?
- xform = CGAffineTransformRotate(xform, M_PI);
- // TODO(fischman): ensure back-camera flip is correct in all orientations,
- // when back-camera support is added.
- [self setTransform:xform];
- _renderer = [[RTCVideoRenderer alloc] initWithView:self];
- }
-}
-
-- (void)renderVideoTrackInterface:(RTCVideoTrack*)videoTrack {
- [_track removeRenderer:_renderer];
- [_renderer stop];
-
- _track = videoTrack;
-
- if (_track) {
- [_track addRenderer:_renderer];
- [_renderer start];
- }
-}
-
-@end
diff --git a/examples/ios/AppRTCDemo/APPRTCViewController.h b/examples/ios/AppRTCDemo/APPRTCViewController.h
index f5fcee4..1737a13 100644
--- a/examples/ios/AppRTCDemo/APPRTCViewController.h
+++ b/examples/ios/AppRTCDemo/APPRTCViewController.h
@@ -27,7 +27,7 @@
#import <UIKit/UIKit.h>
-@class APPRTCVideoView;
+@class RTCEAGLVideoView;
// The view controller that is displayed when AppRTCDemo is loaded.
@interface APPRTCViewController : UIViewController<UITextFieldDelegate>
@@ -37,8 +37,8 @@
@property(weak, nonatomic) IBOutlet UITextView* logView;
@property(weak, nonatomic) IBOutlet UIView* blackView;
-@property(nonatomic, strong) APPRTCVideoView* remoteVideoView;
-@property(nonatomic, strong) APPRTCVideoView* localVideoView;
+@property(nonatomic, strong) RTCEAGLVideoView* localVideoView;
+@property(nonatomic, strong) RTCEAGLVideoView* remoteVideoView;
- (void)displayText:(NSString*)text;
- (void)resetUI;
diff --git a/examples/ios/AppRTCDemo/APPRTCViewController.m b/examples/ios/AppRTCDemo/APPRTCViewController.m
index 0ac9282..bdd8b50 100644
--- a/examples/ios/AppRTCDemo/APPRTCViewController.m
+++ b/examples/ios/AppRTCDemo/APPRTCViewController.m
@@ -27,12 +27,11 @@
#import "APPRTCViewController.h"
-#import "APPRTCVideoView.h"
+#import <AVFoundation/AVFoundation.h>
+#import "RTCEAGLVideoView.h"
@interface APPRTCViewController ()
-
@property(nonatomic, assign) UIInterfaceOrientation statusBarOrientation;
-
@end
@implementation APPRTCViewController
@@ -75,12 +74,10 @@
self.logView.text = nil;
self.blackView.hidden = YES;
- [_remoteVideoView renderVideoTrackInterface:nil];
- [_remoteVideoView removeFromSuperview];
+ [self.remoteVideoView removeFromSuperview];
self.remoteVideoView = nil;
- [_localVideoView renderVideoTrackInterface:nil];
- [_localVideoView removeFromSuperview];
+ [self.localVideoView removeFromSuperview];
self.localVideoView = nil;
}
@@ -97,46 +94,29 @@ enum {
- (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);
- APPRTCVideoView* videoView = [[APPRTCVideoView 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 = [[APPRTCVideoView alloc] initWithFrame:frame];
- videoView.isRemote = FALSE;
-
- [self.blackView addSubview:videoView];
- videoView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
- UIViewAutoresizingFlexibleBottomMargin |
- UIViewAutoresizingFlexibleHeight |
- UIViewAutoresizingFlexibleWidth;
- videoView.translatesAutoresizingMaskIntoConstraints = YES;
- _localVideoView = videoView;
+ CGSize videoSize =
+ CGSizeMake(kRemoteVideoWidth, kRemoteVideoHeight);
+ CGRect remoteVideoFrame =
+ AVMakeRectWithAspectRatioInsideRect(videoSize,
+ self.blackView.bounds);
+ CGRect localVideoFrame = remoteVideoFrame;
+ // TODO(tkchin): use video dimensions from incoming video stream
+ // and handle rotation.
+ localVideoFrame.size.width = remoteVideoFrame.size.height / 4;
+ localVideoFrame.size.height = remoteVideoFrame.size.width / 4;
+ localVideoFrame.origin.x = CGRectGetMaxX(remoteVideoFrame)
+ - localVideoFrame.size.width - kLocalViewPadding;
+ localVideoFrame.origin.y = CGRectGetMaxY(remoteVideoFrame)
+ - localVideoFrame.size.height - kLocalViewPadding;
+
+ self.remoteVideoView =
+ [[RTCEAGLVideoView alloc] initWithFrame:remoteVideoFrame];
+ [self.blackView addSubview:self.remoteVideoView];
+ self.remoteVideoView.transform = CGAffineTransformMakeScale(-1, 1);
+
+ self.localVideoView =
+ [[RTCEAGLVideoView alloc] initWithFrame:localVideoFrame];
+ [self.blackView addSubview:self.localVideoView];
}
#pragma mark - UITextFieldDelegate
diff --git a/examples/ios/AppRTCDemo/Info.plist b/examples/ios/AppRTCDemo/Info.plist
index 72504aa..a32be86 100644
--- a/examples/ios/AppRTCDemo/Info.plist
+++ b/examples/ios/AppRTCDemo/Info.plist
@@ -70,8 +70,6 @@
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
- <string>UIInterfaceOrientationLandscapeLeft</string>
- <string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>