Index: webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m |
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m |
index a2290c2458405a1d39458f64eae820abfdc14bc9..dfafe0abf9120c7f4b2ff8d418e374dbadba626e 100644 |
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m |
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m |
@@ -35,11 +35,13 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
AVCaptureVideoDataOutput *_videoDataOutput; |
AVCaptureSession *_captureSession; |
AVCaptureDevice *_currentDevice; |
- RTCVideoRotation _rotation; |
BOOL _hasRetriedOnFatalError; |
BOOL _isRunning; |
// Will the session be running once all asynchronous operations have been completed? |
BOOL _willBeRunning; |
+#if TARGET_OS_IPHONE |
+ UIDeviceOrientation _orientation; |
+#endif |
} |
@synthesize frameQueue = _frameQueue; |
@@ -56,6 +58,7 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
} |
NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; |
#if TARGET_OS_IPHONE |
+ _orientation = UIDeviceOrientationPortrait; |
[center addObserver:self |
selector:@selector(deviceOrientationDidChange:) |
name:UIDeviceOrientationDidChangeNotification |
@@ -117,6 +120,7 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
- (void)startCaptureWithDevice:(AVCaptureDevice *)device |
format:(AVCaptureDeviceFormat *)format |
fps:(NSInteger)fps { |
+ _isRunning = false; |
magjed_webrtc
2017/06/30 17:50:50
Why is this needed?
jtt_webrtc
2017/06/30 17:54:49
We need to stop frames from being processed until
jtt_webrtc
2017/06/30 18:07:47
I removed this check and the flicker came back.
T
magjed_webrtc
2017/07/03 08:23:46
Why does it flicker if we remove this? I thought i
|
_willBeRunning = true; |
[RTCDispatcher |
dispatchAsyncOnType:RTCDispatcherTypeCaptureSession |
@@ -133,6 +137,7 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
if (![_currentDevice lockForConfiguration:&error]) { |
RTCLogError( |
@"Failed to lock device %@. Error: %@", _currentDevice, error.userInfo); |
+ _isRunning = true; |
magjed_webrtc
2017/06/30 17:50:50
Same here, why is this change needed?
jtt_webrtc
2017/06/30 17:54:49
See above. We don't want to process frames until t
|
return; |
} |
@@ -181,9 +186,13 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer |
fromConnection:(AVCaptureConnection *)connection { |
NSParameterAssert(captureOutput == _videoDataOutput); |
+ NSParameterAssert(1 == connection.inputPorts.count); |
- if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) || |
- !CMSampleBufferDataIsReady(sampleBuffer)) { |
+ if (!_isRunning || !_willBeRunning || |
magjed_webrtc
2017/06/30 17:50:50
Why do we need these extra checks? What happens ot
jtt_webrtc
2017/06/30 17:54:49
See above, we still get the flicker but more rare.
|
+ CMSampleBufferGetNumSamples(sampleBuffer) != 1 || |
+ !CMSampleBufferIsValid(sampleBuffer) || |
+ !CMSampleBufferDataIsReady(sampleBuffer) || !connection.enabled || |
+ !connection.active) { |
return; |
} |
@@ -192,12 +201,46 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
return; |
} |
+#if TARGET_OS_IPHONE |
+ // Default to portrait orientation on iPhone. |
+ RTCVideoRotation rotation = RTCVideoRotation_90; |
+ AVCaptureDeviceInput *deviceInput = |
+ (AVCaptureDeviceInput *)((AVCaptureInputPort *) |
+ connection.inputPorts.firstObject) |
+ .input; |
+ BOOL usingFrontCamera = |
+ deviceInput.device.position == AVCaptureDevicePositionFront; |
+ switch (_orientation) { |
+ case UIDeviceOrientationPortrait: |
+ rotation = RTCVideoRotation_90; |
+ break; |
+ case UIDeviceOrientationPortraitUpsideDown: |
+ rotation = RTCVideoRotation_270; |
+ break; |
+ case UIDeviceOrientationLandscapeLeft: |
+ rotation = usingFrontCamera ? RTCVideoRotation_180 : RTCVideoRotation_0; |
+ break; |
+ case UIDeviceOrientationLandscapeRight: |
+ rotation = usingFrontCamera ? RTCVideoRotation_0 : RTCVideoRotation_180; |
+ break; |
+ case UIDeviceOrientationFaceUp: |
+ case UIDeviceOrientationFaceDown: |
+ case UIDeviceOrientationUnknown: |
+ // Ignore. |
+ break; |
+ } |
+#else |
+ // No rotation on Mac. |
+ RTCVideoRotation rotation = RTCVideoRotation_0; |
+#endif |
+ |
RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]; |
int64_t timeStampNs = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) * |
kNanosecondsPerSecond; |
- RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer |
- rotation:_rotation |
- timeStampNs:timeStampNs]; |
+ RTCVideoFrame *videoFrame = |
+ [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer |
+ rotation:rotation |
+ timeStampNs:timeStampNs]; |
[self.delegate capturer:self didCaptureVideoFrame:videoFrame]; |
} |
@@ -399,26 +442,7 @@ static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) { |
NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession], |
@"updateOrientation must be called on the capture queue."); |
#if TARGET_OS_IPHONE |
- BOOL usingFrontCamera = _currentDevice.position == AVCaptureDevicePositionFront; |
- switch ([UIDevice currentDevice].orientation) { |
- case UIDeviceOrientationPortrait: |
- _rotation = RTCVideoRotation_90; |
- break; |
- case UIDeviceOrientationPortraitUpsideDown: |
- _rotation = RTCVideoRotation_270; |
- break; |
- case UIDeviceOrientationLandscapeLeft: |
- _rotation = usingFrontCamera ? RTCVideoRotation_180 : RTCVideoRotation_0; |
- break; |
- case UIDeviceOrientationLandscapeRight: |
- _rotation = usingFrontCamera ? RTCVideoRotation_0 : RTCVideoRotation_180; |
- break; |
- case UIDeviceOrientationFaceUp: |
- case UIDeviceOrientationFaceDown: |
- case UIDeviceOrientationUnknown: |
- // Ignore. |
- break; |
- } |
+ _orientation = [UIDevice currentDevice].orientation; |
#endif |
} |