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