video: use openGL when metal is not available

Change-Id: Ic2d19d19da72b71f73f12d3efab75c9bb384d2fb
diff --git a/src/CurrentCallVC.mm b/src/CurrentCallVC.mm
index c51af7a..1316ea8 100644
--- a/src/CurrentCallVC.mm
+++ b/src/CurrentCallVC.mm
@@ -51,6 +51,7 @@
 #import "VideoCommon.h"
 #import "views/GradientView.h"
 #import "views/MovableView.h"
+#import "views/RenderingView.h"
 
 @interface CurrentCallVC () <NSPopoverDelegate> {
     QString convUid_;
@@ -96,12 +97,12 @@
 
 // Video
 @property (unsafe_unretained) IBOutlet CallView *videoView;
-@property (unsafe_unretained) IBOutlet CallMTKView *previewView;
+@property (unsafe_unretained) IBOutlet RenderingView *previewView;
 @property (unsafe_unretained) IBOutlet MovableView *movableBaseForView;
 @property (unsafe_unretained) IBOutlet NSView* hidePreviewBackground;
 @property (unsafe_unretained) IBOutlet NSButton* hidePreviewButton;
 
-@property (unsafe_unretained) IBOutlet CallMTKView *videoMTKView;
+@property (unsafe_unretained) IBOutlet RenderingView *distantView;
 
 @property RendererConnectionsHolder* renderConnections;
 @property QMetaObject::Connection videoStarted;
@@ -373,13 +374,13 @@
             [headerGradientView setHidden:YES];
             [controlsPanel setHidden:YES];
             [controlsStackView setHidden:YES];
-            [self.videoMTKView fillWithBlack];
+            [self.distantView fillWithBlack];
             [self.previewView fillWithBlack];
             [hidePreviewBackground setHidden:YES];
             [self.previewView setHidden: YES];
-            [self.videoMTKView setHidden: YES];
-            self.previewView.stopRendering = true;
-            self.videoMTKView.stopRendering = true;
+            [self.distantView setHidden: YES];
+            self.previewView.videoRunning = NO;
+            self.distantView.videoRunning = NO;
             [backgroundImage setHidden:NO];
             [bluerBackgroundEffect setHidden:NO];
             break;
@@ -392,13 +393,13 @@
             [backgroundImage setHidden:NO];
             [bluerBackgroundEffect setHidden:NO];
             if(!currentCall.isAudioOnly) {
-                [self.videoMTKView fillWithBlack];
+                [self.distantView fillWithBlack];
                 [self.previewView fillWithBlack];
                 [hidePreviewBackground setHidden:YES];
                 [self.previewView setHidden: YES];
-                [self.videoMTKView setHidden: YES];
-                self.previewView.stopRendering = true;
-                self.videoMTKView.stopRendering = true;
+                [self.distantView setHidden: YES];
+                self.previewView.videoRunning = NO;
+                self.distantView.videoRunning = NO;
             }
             break;
         case Status::INACTIVE:
@@ -436,19 +437,19 @@
 
 -(void) setUpVideoCallView {
     [previewView fillWithBlack];
-    [self.videoMTKView fillWithBlack];
+    [self.distantView fillWithBlack];
     [previewView setHidden: NO];
-    [self.videoMTKView setHidden:NO];
-    [hidePreviewBackground setHidden: self.previewView.stopRendering];
+    [self.distantView setHidden:NO];
+    [hidePreviewBackground setHidden: !self.previewView.videoRunning];
     [bluerBackgroundEffect setHidden:YES];
     [backgroundImage setHidden:YES];
-    self.previewView.stopRendering = false;
-    self.videoMTKView.stopRendering = false;
+    self.previewView.videoRunning = true;
+    self.distantView.videoRunning = true;
 }
 
 -(void) setUpAudioOnlyView {
     [self.previewView setHidden: YES];
-    [self.videoMTKView setHidden: YES];
+    [self.distantView setHidden: YES];
     [hidePreviewBackground setHidden: YES];
     [bluerBackgroundEffect setHidden:NO];
     [backgroundImage setHidden:NO];
@@ -536,11 +537,11 @@
                          if (id == lrc::api::video::PREVIEW_RENDERER_ID) {
                              [self.previewView setHidden:NO];
                              [hidePreviewBackground setHidden: NO];
-                             self.previewView.stopRendering = false;
+                             self.previewView.videoRunning = true;
                          } else if ([self isCurrentCall: id]) {
                              [self mouseIsMoving: NO];
-                             self.videoMTKView.stopRendering = false;
-                             [self.videoMTKView setHidden:NO];
+                             self.distantView.videoRunning = true;
+                             [self.distantView setHidden:NO];
                              [bluerBackgroundEffect setHidden:YES];
                              [backgroundImage setHidden:YES];
                          }
@@ -551,11 +552,11 @@
                      [=](const QString& id) {
                          if (id == lrc::api::video::PREVIEW_RENDERER_ID) {
                              [self.previewView setHidden:YES];
-                             self.previewView.stopRendering = true;
+                             self.previewView.videoRunning = false;
                          } else if ([self isCurrentCall: id]) {
                              [self mouseIsMoving: YES];
-                             self.videoMTKView.stopRendering = true;
-                             [self.videoMTKView setHidden:YES];
+                             self.distantView.videoRunning = false;
+                             [self.distantView setHidden:YES];
                              [bluerBackgroundEffect setHidden:NO];
                              [backgroundImage setHidden:NO];
                          }
@@ -569,46 +570,19 @@
                              if(!renderer->isRendering()) {
                                  return;
                              }
-                             [hidePreviewBackground setHidden: self.previewView.stopRendering];
-                             [self renderer: renderer renderFrameForPreviewView:previewView];
+                             [hidePreviewBackground setHidden: !self.previewView.videoRunning];
+                             [self rendererPreview: renderer];
                          } else if ([self isCurrentCall: id]) {
                              auto renderer = &mediaModel->getRenderer(id);
                              if(!renderer->isRendering()) {
                                  return;
                              }
-                             [self renderer:renderer renderFrameForDistantView: self.videoMTKView];
+                             [self rendererDistantView: renderer];
                          }
                      });
 }
 
--(void) renderer: (const lrc::api::video::Renderer*)renderer renderFrameForPreviewView:(CallMTKView*) view
-{
-    @autoreleasepool {
-        auto framePtr = renderer->currentAVFrame();
-        auto frame = framePtr.get();
-        if(!frame || !frame->width || !frame->height) {
-            return;
-        }
-        auto frameSize = CGSizeMake(frame->width, frame->height);
-        auto rotation = 0;
-        if (frame->data[3] != NULL && (CVPixelBufferRef)frame->data[3]) {
-            [view renderWithPixelBuffer:(CVPixelBufferRef)frame->data[3]
-                                   size: frameSize
-                               rotation: rotation
-                              fillFrame: true];
-            return;
-        }
-        else if (CVPixelBufferRef pixelBuffer = [self getBufferForPreviewFromFrame:frame]) {
-            [view renderWithPixelBuffer: pixelBuffer
-                                   size: frameSize
-                               rotation: rotation
-                              fillFrame: true];
-        }
-    }
-}
-
--(void) renderer: (const lrc::api::video::Renderer*)renderer renderFrameForDistantView:(CallMTKView*) view
-{
+-(void) rendererDistantView: (const lrc::api::video::Renderer*)renderer {
     @autoreleasepool {
         auto framePtr = renderer->currentAVFrame();
         auto frame = framePtr.get();
@@ -622,13 +596,13 @@
             rotation = av_display_rotation_get(data);
         }
         if (frame->data[3] != NULL && (CVPixelBufferRef)frame->data[3]) {
-            [view renderWithPixelBuffer: (CVPixelBufferRef)frame->data[3]
+            [self.distantView renderWithPixelBuffer: (CVPixelBufferRef)frame->data[3]
                                    size: frameSize
                                rotation: rotation
                               fillFrame: false];
         }
         if (CVPixelBufferRef pixelBuffer = [self getBufferForDistantViewFromFrame:frame]) {
-            [view renderWithPixelBuffer: pixelBuffer
+            [self.distantView renderWithPixelBuffer: pixelBuffer
                                    size: frameSize
                                rotation: rotation
                               fillFrame: false];
@@ -636,6 +610,34 @@
     }
 }
 
+-(void) rendererPreview: (const lrc::api::video::Renderer*)renderer {
+    @autoreleasepool {
+        auto framePtr = renderer->currentAVFrame();
+        auto frame = framePtr.get();
+        if(!frame || !frame->width || !frame->height)  {
+            return;
+        }
+        auto frameSize = CGSizeMake(frame->width, frame->height);
+        auto rotation = 0;
+        if (auto matrix = av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX)) {
+            const int32_t* data = reinterpret_cast<int32_t*>(matrix->data);
+            rotation = av_display_rotation_get(data);
+        }
+        if (frame->data[3] != NULL && (CVPixelBufferRef)frame->data[3]) {
+            [self.previewView renderWithPixelBuffer: (CVPixelBufferRef)frame->data[3]
+                                   size: frameSize
+                               rotation: rotation
+                              fillFrame: false];
+        }
+        if (CVPixelBufferRef pixelBuffer = [self getBufferForPreviewFromFrame:frame]) {
+            [self.previewView renderWithPixelBuffer: pixelBuffer
+                                   size: frameSize
+                               rotation: rotation
+                              fillFrame: true];
+        }
+    }
+}
+
 -(CVPixelBufferRef) getBufferForPreviewFromFrame:(const AVFrame*)frame {
     [VideoCommon fillPixelBuffr:&pixelBufferPreview fromFrame:frame bufferPool:&pixelBufferPoolPreview];
     CVPixelBufferRef buffer  = pixelBufferPreview;
@@ -700,7 +702,7 @@
     [backgroundImage setHidden:NO];
     backgroundImage.layer.contents = nil;
     [self.previewView setHidden:YES];
-    [self.videoMTKView setHidden:YES];
+    [self.distantView setHidden:YES];
 
     contactNameLabel.textColor = [NSColor highlightColor];
     contactNameLabel.textColor = [NSColor highlightColor];