|  | /* | 
|  | *  Copyright 2015 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #import "RTCCameraPreviewView.h" | 
|  |  | 
|  | #import <AVFoundation/AVFoundation.h> | 
|  | #import <UIKit/UIKit.h> | 
|  |  | 
|  | #import "RTCDispatcher+Private.h" | 
|  |  | 
|  | @implementation RTC_OBJC_TYPE (RTCCameraPreviewView) | 
|  |  | 
|  | @synthesize captureSession = _captureSession; | 
|  |  | 
|  | + (Class)layerClass { | 
|  | return [AVCaptureVideoPreviewLayer class]; | 
|  | } | 
|  |  | 
|  | - (instancetype)initWithFrame:(CGRect)aRect { | 
|  | self = [super initWithFrame:aRect]; | 
|  | if (self) { | 
|  | [self addOrientationObserver]; | 
|  | } | 
|  | return self; | 
|  | } | 
|  |  | 
|  | - (instancetype)initWithCoder:(NSCoder*)aDecoder { | 
|  | self = [super initWithCoder:aDecoder]; | 
|  | if (self) { | 
|  | [self addOrientationObserver]; | 
|  | } | 
|  | return self; | 
|  | } | 
|  |  | 
|  | - (void)dealloc { | 
|  | [self removeOrientationObserver]; | 
|  | } | 
|  |  | 
|  | - (void)setCaptureSession:(AVCaptureSession *)captureSession { | 
|  | if (_captureSession == captureSession) { | 
|  | return; | 
|  | } | 
|  | _captureSession = captureSession; | 
|  | [RTC_OBJC_TYPE(RTCDispatcher) | 
|  | dispatchAsyncOnType:RTCDispatcherTypeMain | 
|  | block:^{ | 
|  | AVCaptureVideoPreviewLayer *previewLayer = [self previewLayer]; | 
|  | [RTC_OBJC_TYPE(RTCDispatcher) | 
|  | dispatchAsyncOnType:RTCDispatcherTypeCaptureSession | 
|  | block:^{ | 
|  | previewLayer.session = captureSession; | 
|  | [RTC_OBJC_TYPE(RTCDispatcher) | 
|  | dispatchAsyncOnType:RTCDispatcherTypeMain | 
|  | block:^{ | 
|  | [self setCorrectVideoOrientation]; | 
|  | }]; | 
|  | }]; | 
|  | }]; | 
|  | } | 
|  |  | 
|  | - (void)layoutSubviews { | 
|  | [super layoutSubviews]; | 
|  |  | 
|  | // Update the video orientation based on the device orientation. | 
|  | [self setCorrectVideoOrientation]; | 
|  | } | 
|  |  | 
|  | -(void)orientationChanged:(NSNotification *)notification { | 
|  | [self setCorrectVideoOrientation]; | 
|  | } | 
|  |  | 
|  | - (void)setCorrectVideoOrientation { | 
|  | // Get current device orientation. | 
|  | UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; | 
|  | AVCaptureVideoPreviewLayer *previewLayer = [self previewLayer]; | 
|  |  | 
|  | // First check if we are allowed to set the video orientation. | 
|  | if (previewLayer.connection.isVideoOrientationSupported) { | 
|  | // Set the video orientation based on device orientation. | 
|  | if (deviceOrientation == UIInterfaceOrientationPortraitUpsideDown) { | 
|  | previewLayer.connection.videoOrientation = | 
|  | AVCaptureVideoOrientationPortraitUpsideDown; | 
|  | } else if (deviceOrientation == UIInterfaceOrientationLandscapeRight) { | 
|  | previewLayer.connection.videoOrientation = | 
|  | AVCaptureVideoOrientationLandscapeRight; | 
|  | } else if (deviceOrientation == UIInterfaceOrientationLandscapeLeft) { | 
|  | previewLayer.connection.videoOrientation = | 
|  | AVCaptureVideoOrientationLandscapeLeft; | 
|  | } else if (deviceOrientation == UIInterfaceOrientationPortrait) { | 
|  | previewLayer.connection.videoOrientation = | 
|  | AVCaptureVideoOrientationPortrait; | 
|  | } | 
|  | // If device orientation switches to FaceUp or FaceDown, don't change video orientation. | 
|  | } | 
|  | } | 
|  |  | 
|  | #pragma mark - Private | 
|  |  | 
|  | - (void)addOrientationObserver { | 
|  | [[NSNotificationCenter defaultCenter] addObserver:self | 
|  | selector:@selector(orientationChanged:) | 
|  | name:UIDeviceOrientationDidChangeNotification | 
|  | object:nil]; | 
|  | } | 
|  |  | 
|  | - (void)removeOrientationObserver { | 
|  | [[NSNotificationCenter defaultCenter] removeObserver:self | 
|  | name:UIDeviceOrientationDidChangeNotification | 
|  | object:nil]; | 
|  | } | 
|  |  | 
|  | - (AVCaptureVideoPreviewLayer *)previewLayer { | 
|  | return (AVCaptureVideoPreviewLayer *)self.layer; | 
|  | } | 
|  |  | 
|  | @end |