Add renderer-agnostic delegate protocol.
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 <kthelgason@webrtc.org>
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22944}
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m b/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m
index ff23bc6..869858e 100644
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m
+++ b/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m
@@ -27,6 +27,7 @@
id<RTCMTLRenderer> _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 24dc29f..eff06af 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 60c624e..dba1d7a 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<RTCVideoViewDelegate>
@end
/**
@@ -32,7 +30,7 @@
RTC_EXPORT
@interface RTCEAGLVideoView : UIView <RTCVideoRenderer>
-@property(nonatomic, weak) id<RTCEAGLVideoViewDelegate> delegate;
+@property(nonatomic, weak) id<RTCVideoViewDelegate> delegate;
- (instancetype)initWithFrame:(CGRect)frame
shader:(id<RTCVideoViewShading>)shader NS_DESIGNATED_INITIALIZER;
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h
index 4990e25..f82126c 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<RTCVideoRenderer>
+
+@property(nonatomic, weak) id<RTCVideoViewDelegate> delegate;
+
+ (BOOL)isMetalAvailable;
@end
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h
index 226c62a..802e0ff 100644
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h
+++ b/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h
@@ -32,6 +32,7 @@
RTC_EXPORT
@interface RTCMTLVideoView : UIView <RTCVideoRenderer>
-
+@property(nonatomic, weak) id<RTCVideoViewDelegate> 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 9e6a9ce..62c7968 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<RTCVideoViewDelegate>
@end
@interface RTCNSGLVideoView : NSOpenGLView <RTCVideoRenderer>
-@property(nonatomic, weak) id<RTCNSGLVideoViewDelegate> delegate;
+@property(nonatomic, weak) id<RTCVideoViewDelegate> 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 5e2e820..7d91f2f 100644
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h
+++ b/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h
@@ -30,4 +30,11 @@
@end
+RTC_EXPORT
+@protocol RTCVideoViewDelegate
+
+- (void)videoView:(id<RTCVideoRenderer>)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 91%
rename from sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm
rename to sdk/objc/Framework/UnitTests/RTCMTLVideoView_xctest.m
index 8533a31..a832173 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