From 06d094f3e6210feef3d63a6c33719f7db34289fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1ri=20Tristan=20Helgason?= Date: Thu, 19 Apr 2018 17:38:05 +0200 Subject: [PATCH] Add renderer-agnostic delegate protocol. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MTL renderer should also have a way to notify it's delegate that it's content size changed. The plan is to introduce this new protocol, move existing clients over to implementing it in favour of RTCEAGLVideoViewDelegate, and then finally removing the old protocol. Bug: b/73147161 Change-Id: I908d7b2667e44e02a58066d701a48efec0e98d14 Reviewed-on: https://webrtc-review.googlesource.com/70243 Commit-Queue: Kári Helgason Reviewed-by: Anders Carlsson Cr-Commit-Position: refs/heads/master@{#22944} --- sdk/BUILD.gn | 2 +- .../Classes/Metal/RTCMTLNSVideoView.m | 4 ++++ .../Framework/Classes/Metal/RTCMTLVideoView.m | 4 ++++ .../Headers/WebRTC/RTCEAGLVideoView.h | 8 +++---- .../Headers/WebRTC/RTCMTLNSVideoView.h | 3 +++ .../Headers/WebRTC/RTCMTLVideoView.h | 3 ++- .../Headers/WebRTC/RTCNSGLVideoView.h | 6 ++--- .../Headers/WebRTC/RTCVideoRenderer.h | 7 ++++++ ...iew_xctest.mm => RTCMTLVideoView_xctest.m} | 23 ++++++++++++++----- 9 files changed, 43 insertions(+), 17 deletions(-) rename sdk/objc/Framework/UnitTests/{RTCMTLVideoView_xctest.mm => RTCMTLVideoView_xctest.m} (92%) diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 62e42861e3..b13c50ba2a 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -700,7 +700,7 @@ if (is_ios || is_mac) { ] if (rtc_use_metal_rendering) { - sources += [ "objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm" ] + sources += [ "objc/Framework/UnitTests/RTCMTLVideoView_xctest.m" ] deps += [ ":metal_objc" ] } diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m b/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m index ff23bc6e6e..869858e6b4 100644 --- a/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m +++ b/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m @@ -27,6 +27,7 @@ id _renderer; } +@synthesize delegate = _delegate; @synthesize renderer = _renderer; @synthesize metalView = _metalView; @synthesize videoFrame = _videoFrame; @@ -105,6 +106,9 @@ - (void)setSize:(CGSize)size { _metalView.drawableSize = size; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.delegate videoView:self didChangeVideoSize:size]; + }); [_metalView draw]; } diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m b/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m index 24dc29f7f3..eff06af81e 100644 --- a/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m +++ b/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m @@ -37,6 +37,7 @@ int64_t _lastFrameTimeNs; } +@synthesize delegate = _delegate; @synthesize rendererI420 = _rendererI420; @synthesize rendererNV12 = _rendererNV12; @synthesize metalView = _metalView; @@ -144,6 +145,9 @@ - (void)setSize:(CGSize)size { self.metalView.drawableSize = size; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.delegate videoView:self didChangeVideoSize:size]; + }); } - (void)renderFrame:(nullable RTCVideoFrame *)frame { diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h index 60c624e0d2..dba1d7ab64 100644 --- a/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h +++ b/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h @@ -18,11 +18,9 @@ NS_ASSUME_NONNULL_BEGIN @class RTCEAGLVideoView; + RTC_EXPORT -@protocol RTCEAGLVideoViewDelegate - -- (void)videoView:(RTCEAGLVideoView *)videoView didChangeVideoSize:(CGSize)size; - +@protocol RTCEAGLVideoViewDelegate @end /** @@ -32,7 +30,7 @@ RTC_EXPORT RTC_EXPORT @interface RTCEAGLVideoView : UIView -@property(nonatomic, weak) id delegate; +@property(nonatomic, weak) id delegate; - (instancetype)initWithFrame:(CGRect)frame shader:(id)shader NS_DESIGNATED_INITIALIZER; diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h index 4990e2529e..f82126c388 100644 --- a/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h +++ b/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h @@ -13,5 +13,8 @@ NS_AVAILABLE_MAC(10.11) @interface RTCMTLNSVideoView : NSView + +@property(nonatomic, weak) id delegate; + + (BOOL)isMetalAvailable; @end diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h index 226c62a6a1..802e0ff325 100644 --- a/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h +++ b/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h @@ -32,6 +32,7 @@ NS_CLASS_AVAILABLE_IOS(9) RTC_EXPORT @interface RTCMTLVideoView : UIView - +@property(nonatomic, weak) id delegate; @end + NS_ASSUME_NONNULL_END diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h index 9e6a9ce948..62c79682ef 100644 --- a/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h +++ b/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h @@ -20,15 +20,13 @@ NS_ASSUME_NONNULL_BEGIN @class RTCNSGLVideoView; -@protocol RTCNSGLVideoViewDelegate - -- (void)videoView:(RTCNSGLVideoView *)videoView didChangeVideoSize:(CGSize)size; +@protocol RTCNSGLVideoViewDelegate @end @interface RTCNSGLVideoView : NSOpenGLView -@property(nonatomic, weak) id delegate; +@property(nonatomic, weak) id delegate; - (instancetype)initWithFrame:(NSRect)frameRect pixelFormat:(NSOpenGLPixelFormat *)format diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h index 5e2e820918..7d91f2f14d 100644 --- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h +++ b/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h @@ -30,4 +30,11 @@ RTC_EXPORT @end +RTC_EXPORT +@protocol RTCVideoViewDelegate + +- (void)videoView:(id)videoView didChangeVideoSize:(CGSize)size; + +@end + NS_ASSUME_NONNULL_END diff --git a/sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm b/sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.m similarity index 92% rename from sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm rename to sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.m index 8533a31066..a832173b2a 100644 --- a/sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm +++ b/sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.m @@ -62,12 +62,8 @@ id frameMock = OCMClassMock([RTCVideoFrame class]); if (hasCVPixelBuffer) { CVPixelBufferRef pixelBufferRef; - CVPixelBufferCreate(kCFAllocatorDefault, - 200, - 200, - kCVPixelFormatType_420YpCbCr8Planar, - nullptr, - &pixelBufferRef); + CVPixelBufferCreate( + kCFAllocatorDefault, 200, 200, kCVPixelFormatType_420YpCbCr8Planar, nil, &pixelBufferRef); OCMStub([frameMock buffer]) .andReturn([[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBufferRef]); } else { @@ -247,4 +243,19 @@ [self.rendererNV12Mock verify]; } +- (void)testReportsSizeChangesToDelegate { + OCMStub([self.classMock isMetalAvailable]).andReturn(YES); + + id delegateMock = OCMProtocolMock(@protocol(RTCVideoViewDelegate)); + CGSize size = CGSizeMake(640, 480); + OCMExpect([delegateMock videoView:[OCMArg any] didChangeVideoSize:size]); + + RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init]; + realView.delegate = delegateMock; + [realView setSize:size]; + + // Delegate method is invoked with a dispatch_async. + OCMVerifyAllWithDelay(delegateMock, 1); +} + @end