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 {