iOS camera switching video capturer.

Introduces a new capture class derived from cricket::VideoCapturer that
provides the ability to switch cameras and updates AppRTCDemo to use it.
Some future work pending to clean up AppRTCDemo UI.

BUG=4070
R=magjed@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/48279005

Cr-Commit-Position: refs/heads/master@{#9137}
This commit is contained in:
Zeke Chin
2015-05-05 07:52:31 -07:00
parent 5cb9ce4c74
commit 57cc74e32c
17 changed files with 899 additions and 84 deletions

View File

@@ -27,11 +27,15 @@
#import "ARDVideoCallViewController.h"
#import "RTCAVFoundationVideoSource.h"
#import "ARDAppClient.h"
#import "ARDVideoCallView.h"
@interface ARDVideoCallViewController () <ARDAppClientDelegate,
ARDVideoCallViewDelegate>
@property(nonatomic, strong) RTCVideoTrack *localVideoTrack;
@property(nonatomic, strong) RTCVideoTrack *remoteVideoTrack;
@property(nonatomic, readonly) ARDVideoCallView *videoCallView;
@end
@@ -90,19 +94,13 @@
- (void)appClient:(ARDAppClient *)client
didReceiveLocalVideoTrack:(RTCVideoTrack *)localVideoTrack {
if (!_localVideoTrack) {
_localVideoTrack = localVideoTrack;
[_localVideoTrack addRenderer:_videoCallView.localVideoView];
}
self.localVideoTrack = localVideoTrack;
}
- (void)appClient:(ARDAppClient *)client
didReceiveRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack {
if (!_remoteVideoTrack) {
_remoteVideoTrack = remoteVideoTrack;
[_remoteVideoTrack addRenderer:_videoCallView.remoteVideoView];
_videoCallView.statusLabel.hidden = YES;
}
self.remoteVideoTrack = remoteVideoTrack;
_videoCallView.statusLabel.hidden = YES;
}
- (void)appClient:(ARDAppClient *)client
@@ -119,24 +117,54 @@
[self hangup];
}
- (void)videoCallViewDidSwitchCamera:(ARDVideoCallView *)view {
// TODO(tkchin): Rate limit this so you can't tap continously on it.
// Probably through an animation.
[self switchCamera];
}
#pragma mark - Private
- (void)setLocalVideoTrack:(RTCVideoTrack *)localVideoTrack {
if (_localVideoTrack == localVideoTrack) {
return;
}
[_localVideoTrack removeRenderer:_videoCallView.localVideoView];
_localVideoTrack = nil;
[_videoCallView.localVideoView renderFrame:nil];
_localVideoTrack = localVideoTrack;
[_localVideoTrack addRenderer:_videoCallView.localVideoView];
}
- (void)setRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack {
if (_remoteVideoTrack == remoteVideoTrack) {
return;
}
[_remoteVideoTrack removeRenderer:_videoCallView.localVideoView];
_remoteVideoTrack = nil;
[_videoCallView.remoteVideoView renderFrame:nil];
_remoteVideoTrack = remoteVideoTrack;
[_remoteVideoTrack addRenderer:_videoCallView.remoteVideoView];
}
- (void)hangup {
if (_remoteVideoTrack) {
[_remoteVideoTrack removeRenderer:_videoCallView.remoteVideoView];
_remoteVideoTrack = nil;
[_videoCallView.remoteVideoView renderFrame:nil];
}
if (_localVideoTrack) {
[_localVideoTrack removeRenderer:_videoCallView.localVideoView];
_localVideoTrack = nil;
[_videoCallView.localVideoView renderFrame:nil];
}
self.remoteVideoTrack = nil;
self.localVideoTrack = nil;
[_client disconnect];
[self.presentingViewController dismissViewControllerAnimated:YES
completion:nil];
}
- (void)switchCamera {
RTCVideoSource* source = self.localVideoTrack.source;
if ([source isKindOfClass:[RTCAVFoundationVideoSource class]]) {
RTCAVFoundationVideoSource* avSource = (RTCAVFoundationVideoSource*)source;
avSource.useBackCamera = !avSource.useBackCamera;
_videoCallView.localVideoView.transform = avSource.useBackCamera ?
CGAffineTransformIdentity : CGAffineTransformMakeScale(-1, 1);
}
}
- (NSString *)statusTextForState:(RTCICEConnectionState)state {
switch (state) {
case RTCICEConnectionNew: