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];