From a8f13ccad400eb8ff84a379042c0595951ca9658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1ri=20Tristan=20Helgason?= Date: Thu, 5 Apr 2018 11:48:00 +0200 Subject: [PATCH] Improve thread-safety of MTL Renderer. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: b/77579859 Change-Id: I427d0f41593155dc5cbf98a09d7ec826497b803c Reviewed-on: https://webrtc-review.googlesource.com/67040 Commit-Queue: Kári Helgason Reviewed-by: Anders Carlsson Cr-Commit-Position: refs/heads/master@{#22795} --- .../Classes/Metal/RTCMTLNV12Renderer.mm | 2 ++ .../Framework/Classes/Metal/RTCMTLVideoView.m | 22 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm b/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm index 079b5fb76c..6de9c347e6 100644 --- a/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm +++ b/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm @@ -18,6 +18,7 @@ #import "WebRTC/RTCVideoFrameBuffer.h" #import "RTCMTLRenderer+Private.h" +#include "rtc_base/checks.h" #define MTL_STRINGIFY(s) @ #s @@ -85,6 +86,7 @@ static NSString *const shaderSource = MTL_STRINGIFY( } - (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame { + RTC_DCHECK([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]); [super setupTexturesForFrame:frame]; CVPixelBufferRef pixelBuffer = ((RTCCVPixelBuffer *)frame.buffer).pixelBuffer; diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m b/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m index 0e17777c4a..e343bb48b4 100644 --- a/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m +++ b/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m @@ -105,32 +105,32 @@ - (void)drawInMTKView:(nonnull MTKView *)view { NSAssert(view == self.metalView, @"Receiving draw callbacks from foreign instance."); - if (!self.videoFrame) { + RTCVideoFrame *videoFrame = self.videoFrame; + if (!videoFrame) { return; } - id renderer = nil; - if ([self.videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) { - if (!self.rendererNV12) { + if ([videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) { + static dispatch_once_t nv12_token; + dispatch_once(&nv12_token, ^{ self.rendererNV12 = [RTCMTLVideoView createNV12Renderer]; if (![self.rendererNV12 addRenderingDestination:self.metalView]) { self.rendererNV12 = nil; RTCLogError(@"Failed to create NV12 renderer"); } - } - renderer = self.rendererNV12; + }); + [self.rendererNV12 drawFrame:videoFrame]; } else { - if (!self.rendererI420) { + static dispatch_once_t i420_token; + dispatch_once(&i420_token, ^{ self.rendererI420 = [RTCMTLVideoView createI420Renderer]; if (![self.rendererI420 addRenderingDestination:self.metalView]) { self.rendererI420 = nil; RTCLogError(@"Failed to create I420 renderer"); } - } - renderer = self.rendererI420; + }); + [self.rendererI420 drawFrame:videoFrame]; } - - [renderer drawFrame:self.videoFrame]; } - (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size {