Index: webrtc/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm |
diff --git a/webrtc/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm b/webrtc/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm |
index 166a609824941775e629936bb6e4c03905d20242..c67a87d3b369abc267b8b0ff2e0826178186c30a 100644 |
--- a/webrtc/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm |
+++ b/webrtc/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm |
@@ -28,11 +28,13 @@ |
AVCaptureVideoDataOutput *_videoDataOutput; |
// The cricket::VideoCapturer that owns this class. Should never be NULL. |
webrtc::AVFoundationVideoCapturer *_capturer; |
- webrtc::VideoRotation _rotation; |
BOOL _hasRetriedOnFatalError; |
BOOL _isRunning; |
BOOL _hasStarted; |
rtc::CriticalSection _crit; |
+#if TARGET_OS_IPHONE |
+ UIDeviceOrientation _orientation; |
+#endif |
} |
@synthesize captureSession = _captureSession; |
@@ -57,6 +59,7 @@ |
} |
NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; |
#if TARGET_OS_IPHONE |
+ _orientation = UIDeviceOrientationPortrait; |
[center addObserver:self |
selector:@selector(deviceOrientationDidChange:) |
name:UIDeviceOrientationDidChangeNotification |
@@ -157,24 +160,17 @@ |
if (self.hasStarted) { |
return; |
} |
- self.hasStarted = YES; |
+ self.hasStarted = NO; |
[RTCDispatcher |
dispatchAsyncOnType:RTCDispatcherTypeCaptureSession |
block:^{ |
-#if TARGET_OS_IPHONE |
- // Default to portrait orientation on iPhone. This will be reset in |
- // updateOrientation unless orientation is unknown/faceup/facedown. |
- _rotation = webrtc::kVideoRotation_90; |
-#else |
- // No rotation on Mac. |
- _rotation = webrtc::kVideoRotation_0; |
-#endif |
[self updateOrientation]; |
#if TARGET_OS_IPHONE |
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; |
#endif |
AVCaptureSession *captureSession = self.captureSession; |
[captureSession startRunning]; |
+ self.hasStarted = YES; |
}]; |
} |
@@ -215,10 +211,47 @@ |
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer |
fromConnection:(AVCaptureConnection *)connection { |
NSParameterAssert(captureOutput == _videoDataOutput); |
- if (!self.hasStarted) { |
+ if (!self.hasStarted || !self.isRunning || !connection.enabled || |
+ !connection.active) { |
return; |
} |
- _capturer->CaptureSampleBuffer(sampleBuffer, _rotation); |
+ |
+#if TARGET_OS_IPHONE |
+ // Default to portrait orientation on iPhone. |
+ webrtc::VideoRotation rotation = webrtc::kVideoRotation_90; |
+ AVCaptureDeviceInput *deviceInput = |
+ (AVCaptureDeviceInput *)((AVCaptureInputPort *) |
+ connection.inputPorts.firstObject) |
+ .input; |
+ BOOL usingFrontCamera = |
+ deviceInput.device.position == AVCaptureDevicePositionFront; |
+ switch (_orientation) { |
+ case UIDeviceOrientationPortrait: |
+ rotation = webrtc::kVideoRotation_90; |
+ break; |
+ case UIDeviceOrientationPortraitUpsideDown: |
+ rotation = webrtc::kVideoRotation_270; |
+ break; |
+ case UIDeviceOrientationLandscapeLeft: |
+ rotation = usingFrontCamera ? webrtc::kVideoRotation_180 |
+ : webrtc::kVideoRotation_0; |
+ break; |
+ case UIDeviceOrientationLandscapeRight: |
+ rotation = usingFrontCamera ? webrtc::kVideoRotation_0 |
+ : webrtc::kVideoRotation_180; |
+ break; |
+ case UIDeviceOrientationFaceUp: |
+ case UIDeviceOrientationFaceDown: |
+ case UIDeviceOrientationUnknown: |
+ // Ignore. |
+ break; |
+ } |
+#else |
+ // No rotation on Mac. |
+ webrtc::VideoRotation rotation = webrtc::kVideoRotation_0; |
+#endif |
+ |
+ _capturer->CaptureSampleBuffer(sampleBuffer, rotation); |
} |
- (void)captureOutput:(AVCaptureOutput *)captureOutput |
@@ -448,32 +481,13 @@ |
// Called from capture session queue. |
- (void)updateOrientation { |
#if TARGET_OS_IPHONE |
- switch ([UIDevice currentDevice].orientation) { |
- case UIDeviceOrientationPortrait: |
- _rotation = webrtc::kVideoRotation_90; |
- break; |
- case UIDeviceOrientationPortraitUpsideDown: |
- _rotation = webrtc::kVideoRotation_270; |
- break; |
- case UIDeviceOrientationLandscapeLeft: |
- _rotation = |
- _capturer->GetUseBackCamera() ? webrtc::kVideoRotation_0 : webrtc::kVideoRotation_180; |
- break; |
- case UIDeviceOrientationLandscapeRight: |
- _rotation = |
- _capturer->GetUseBackCamera() ? webrtc::kVideoRotation_180 : webrtc::kVideoRotation_0; |
- break; |
- case UIDeviceOrientationFaceUp: |
- case UIDeviceOrientationFaceDown: |
- case UIDeviceOrientationUnknown: |
- // Ignore. |
- break; |
- } |
+ _orientation = [UIDevice currentDevice].orientation; |
#endif |
} |
// Update the current session input to match what's stored in _useBackCamera. |
- (void)updateSessionInputForUseBackCamera:(BOOL)useBackCamera { |
+ self.isRunning = NO; |
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession |
block:^{ |
[_captureSession beginConfiguration]; |
@@ -497,6 +511,7 @@ |
webrtc::SetFormatForCaptureDevice( |
newDevice, _captureSession, *format); |
[_captureSession commitConfiguration]; |
+ self.isRunning = YES; |
}]; |
} |