Add new view that renders local video using AVCaptureLayerPreview.
BUG= Review URL: https://codereview.webrtc.org/1497393002 Cr-Commit-Position: refs/heads/master@{#10940}
This commit is contained in:
@ -21,15 +21,8 @@ static CGFloat const kRoomTextFieldMargin = 8;
|
||||
static CGFloat const kCallControlMargin = 8;
|
||||
static CGFloat const kAppLabelHeight = 20;
|
||||
|
||||
@class ARDRoomTextField;
|
||||
@protocol ARDRoomTextFieldDelegate <NSObject>
|
||||
- (void)roomTextField:(ARDRoomTextField *)roomTextField
|
||||
didInputRoom:(NSString *)room;
|
||||
@end
|
||||
|
||||
// Helper view that contains a text field and a clear button.
|
||||
@interface ARDRoomTextField : UIView <UITextFieldDelegate>
|
||||
@property(nonatomic, weak) id<ARDRoomTextFieldDelegate> delegate;
|
||||
@property(nonatomic, readonly) NSString *roomText;
|
||||
@end
|
||||
|
||||
@ -38,14 +31,14 @@ static CGFloat const kAppLabelHeight = 20;
|
||||
UIButton *_clearButton;
|
||||
}
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame {
|
||||
if (self = [super initWithFrame:frame]) {
|
||||
_roomText = [[UITextField alloc] initWithFrame:CGRectZero];
|
||||
_roomText.borderStyle = UITextBorderStyleNone;
|
||||
_roomText.font = [UIFont fontWithName:@"Roboto" size:12];
|
||||
_roomText.placeholder = @"Room name";
|
||||
_roomText.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
_roomText.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
||||
_roomText.delegate = self;
|
||||
[_roomText addTarget:self
|
||||
action:@selector(textFieldDidChange:)
|
||||
@ -96,10 +89,6 @@ static CGFloat const kAppLabelHeight = 20;
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
||||
[_delegate roomTextField:self didInputRoom:textField.text];
|
||||
}
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
// There is no other control that can take focus, so manually resign focus
|
||||
// when return (Join) is pressed to trigger |textFieldDidEndEditing|.
|
||||
@ -125,9 +114,6 @@ static CGFloat const kAppLabelHeight = 20;
|
||||
|
||||
@end
|
||||
|
||||
@interface ARDMainView () <ARDRoomTextFieldDelegate>
|
||||
@end
|
||||
|
||||
@implementation ARDMainView {
|
||||
UILabel *_appLabel;
|
||||
ARDRoomTextField *_roomText;
|
||||
@ -151,7 +137,6 @@ static CGFloat const kAppLabelHeight = 20;
|
||||
[self addSubview:_appLabel];
|
||||
|
||||
_roomText = [[ARDRoomTextField alloc] initWithFrame:CGRectZero];
|
||||
_roomText.delegate = self;
|
||||
[self addSubview:_roomText];
|
||||
|
||||
UIFont *controlFont = [UIFont fontWithName:@"Roboto" size:20];
|
||||
@ -260,16 +245,6 @@ static CGFloat const kAppLabelHeight = 20;
|
||||
_startCallButton.frame.size.height);
|
||||
}
|
||||
|
||||
#pragma mark - ARDRoomTextFieldDelegate
|
||||
|
||||
- (void)roomTextField:(ARDRoomTextField *)roomTextField
|
||||
didInputRoom:(NSString *)room {
|
||||
[_delegate mainView:self
|
||||
didInputRoom:room
|
||||
isLoopback:NO
|
||||
isAudioOnly:_audioOnlySwitch.isOn];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)onStartCall:(id)sender {
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import "webrtc/base/objc/RTCCameraPreviewView.h"
|
||||
#import "RTCEAGLVideoView.h"
|
||||
|
||||
#import "ARDStatsView.h"
|
||||
@ -33,7 +34,7 @@
|
||||
@interface ARDVideoCallView : UIView
|
||||
|
||||
@property(nonatomic, readonly) UILabel *statusLabel;
|
||||
@property(nonatomic, readonly) RTCEAGLVideoView *localVideoView;
|
||||
@property(nonatomic, readonly) RTCCameraPreviewView *localVideoView;
|
||||
@property(nonatomic, readonly) RTCEAGLVideoView *remoteVideoView;
|
||||
@property(nonatomic, readonly) ARDStatsView *statsView;
|
||||
@property(nonatomic, weak) id<ARDVideoCallViewDelegate> delegate;
|
||||
|
||||
@ -25,7 +25,6 @@ static CGFloat const kStatusBarHeight = 20;
|
||||
@implementation ARDVideoCallView {
|
||||
UIButton *_cameraSwitchButton;
|
||||
UIButton *_hangupButton;
|
||||
CGSize _localVideoSize;
|
||||
CGSize _remoteVideoSize;
|
||||
BOOL _useRearCamera;
|
||||
}
|
||||
@ -42,10 +41,7 @@ static CGFloat const kStatusBarHeight = 20;
|
||||
_remoteVideoView.delegate = self;
|
||||
[self addSubview:_remoteVideoView];
|
||||
|
||||
// TODO(tkchin): replace this with a view that renders layer from
|
||||
// AVCaptureSession.
|
||||
_localVideoView = [[RTCEAGLVideoView alloc] initWithFrame:CGRectZero];
|
||||
_localVideoView.delegate = self;
|
||||
_localVideoView = [[RTCCameraPreviewView alloc] initWithFrame:CGRectZero];
|
||||
[self addSubview:_localVideoView];
|
||||
|
||||
_statsView = [[ARDStatsView alloc] initWithFrame:CGRectZero];
|
||||
@ -114,22 +110,15 @@ static CGFloat const kStatusBarHeight = 20;
|
||||
_remoteVideoView.frame = bounds;
|
||||
}
|
||||
|
||||
if (_localVideoSize.width && _localVideoSize.height > 0) {
|
||||
// Aspect fit local video view into a square box.
|
||||
CGRect localVideoFrame =
|
||||
CGRectMake(0, 0, kLocalVideoViewSize, kLocalVideoViewSize);
|
||||
localVideoFrame =
|
||||
AVMakeRectWithAspectRatioInsideRect(_localVideoSize, localVideoFrame);
|
||||
|
||||
// Place the view in the bottom right.
|
||||
localVideoFrame.origin.x = CGRectGetMaxX(bounds)
|
||||
- localVideoFrame.size.width - kLocalVideoViewPadding;
|
||||
localVideoFrame.origin.y = CGRectGetMaxY(bounds)
|
||||
- localVideoFrame.size.height - kLocalVideoViewPadding;
|
||||
_localVideoView.frame = localVideoFrame;
|
||||
} else {
|
||||
_localVideoView.frame = bounds;
|
||||
}
|
||||
// Aspect fit local video view into a square box.
|
||||
CGRect localVideoFrame =
|
||||
CGRectMake(0, 0, kLocalVideoViewSize, kLocalVideoViewSize);
|
||||
// Place the view in the bottom right.
|
||||
localVideoFrame.origin.x = CGRectGetMaxX(bounds)
|
||||
- localVideoFrame.size.width - kLocalVideoViewPadding;
|
||||
localVideoFrame.origin.y = CGRectGetMaxY(bounds)
|
||||
- localVideoFrame.size.height - kLocalVideoViewPadding;
|
||||
_localVideoView.frame = localVideoFrame;
|
||||
|
||||
// Place stats at the top.
|
||||
CGSize statsSize = [_statsView sizeThatFits:bounds.size];
|
||||
@ -159,10 +148,7 @@ static CGFloat const kStatusBarHeight = 20;
|
||||
#pragma mark - RTCEAGLVideoViewDelegate
|
||||
|
||||
- (void)videoView:(RTCEAGLVideoView*)videoView didChangeVideoSize:(CGSize)size {
|
||||
if (videoView == _localVideoView) {
|
||||
_localVideoSize = size;
|
||||
_localVideoView.hidden = CGSizeEqualToSize(CGSizeZero, _localVideoSize);
|
||||
} else if (videoView == _remoteVideoView) {
|
||||
if (videoView == _remoteVideoView) {
|
||||
_remoteVideoSize = size;
|
||||
}
|
||||
[self setNeedsLayout];
|
||||
|
||||
@ -128,18 +128,21 @@
|
||||
if (_localVideoTrack == localVideoTrack) {
|
||||
return;
|
||||
}
|
||||
[_localVideoTrack removeRenderer:_videoCallView.localVideoView];
|
||||
_localVideoTrack = nil;
|
||||
[_videoCallView.localVideoView renderFrame:nil];
|
||||
_localVideoTrack = localVideoTrack;
|
||||
[_localVideoTrack addRenderer:_videoCallView.localVideoView];
|
||||
RTCAVFoundationVideoSource *source = nil;
|
||||
if ([localVideoTrack.source
|
||||
isKindOfClass:[RTCAVFoundationVideoSource class]]) {
|
||||
source = (RTCAVFoundationVideoSource*)localVideoTrack.source;
|
||||
}
|
||||
_videoCallView.localVideoView.captureSession = source.captureSession;
|
||||
}
|
||||
|
||||
- (void)setRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack {
|
||||
if (_remoteVideoTrack == remoteVideoTrack) {
|
||||
return;
|
||||
}
|
||||
[_remoteVideoTrack removeRenderer:_videoCallView.localVideoView];
|
||||
[_remoteVideoTrack removeRenderer:_videoCallView.remoteVideoView];
|
||||
_remoteVideoTrack = nil;
|
||||
[_videoCallView.remoteVideoView renderFrame:nil];
|
||||
_remoteVideoTrack = remoteVideoTrack;
|
||||
|
||||
Reference in New Issue
Block a user