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}
This commit is contained in:

committed by
Commit Bot

parent
9fd6b98f44
commit
06d094f3e6
@ -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" ]
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
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;
|
||||
|
@ -13,5 +13,8 @@
|
||||
|
||||
NS_AVAILABLE_MAC(10.11)
|
||||
@interface RTCMTLNSVideoView : NSView<RTCVideoRenderer>
|
||||
|
||||
@property(nonatomic, weak) id<RTCVideoViewDelegate> delegate;
|
||||
|
||||
+ (BOOL)isMetalAvailable;
|
||||
@end
|
||||
|
@ -32,6 +32,7 @@ NS_CLASS_AVAILABLE_IOS(9)
|
||||
|
||||
RTC_EXPORT
|
||||
@interface RTCMTLVideoView : UIView <RTCVideoRenderer>
|
||||
|
||||
@property(nonatomic, weak) id<RTCVideoViewDelegate> delegate;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
@ -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
|
||||
|
@ -30,4 +30,11 @@ RTC_EXPORT
|
||||
|
||||
@end
|
||||
|
||||
RTC_EXPORT
|
||||
@protocol RTCVideoViewDelegate
|
||||
|
||||
- (void)videoView:(id<RTCVideoRenderer>)videoView didChangeVideoSize:(CGSize)size;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
@ -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
|
Reference in New Issue
Block a user