Fix support orientation changes in Camera Preview

Bug: webrtc:8532
Change-Id: I2a3cc6974af711f1be6a55a6a1e04e7189175bd3
Reviewed-on: https://webrtc-review.googlesource.com/23220
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20702}
diff --git a/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m b/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m
index 8af3384..2b31e10 100644
--- a/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m
+++ b/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m
@@ -23,6 +23,26 @@
   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;
@@ -34,6 +54,10 @@
     [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
                                  block:^{
       previewLayer.session = captureSession;
+      [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeMain
+                               block:^{
+        [self setCorrectVideoOrientation];
+      }];
     }];
   }];
 }
@@ -45,6 +69,10 @@
   [self setCorrectVideoOrientation];
 }
 
+-(void)orientationChanged:(NSNotification *)notification {
+  [self setCorrectVideoOrientation];
+}
+
 - (void)setCorrectVideoOrientation {
   // Get current device orientation.
   UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
@@ -71,6 +99,19 @@
 
 #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;
 }