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:
Kári Tristan Helgason
2018-04-19 17:38:05 +02:00
committed by Commit Bot
parent 9fd6b98f44
commit 06d094f3e6
9 changed files with 43 additions and 17 deletions

View File

@ -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" ]
}

View File

@ -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];
}

View File

@ -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 {

View File

@ -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;

View File

@ -13,5 +13,8 @@
NS_AVAILABLE_MAC(10.11)
@interface RTCMTLNSVideoView : NSView<RTCVideoRenderer>
@property(nonatomic, weak) id<RTCVideoViewDelegate> delegate;
+ (BOOL)isMetalAvailable;
@end

View File

@ -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

View File

@ -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

View File

@ -30,4 +30,11 @@ RTC_EXPORT
@end
RTC_EXPORT
@protocol RTCVideoViewDelegate
- (void)videoView:(id<RTCVideoRenderer>)videoView didChangeVideoSize:(CGSize)size;
@end
NS_ASSUME_NONNULL_END

View File

@ -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