From 891a446a920bb7d51b8d17bae071f44d591ee5e2 Mon Sep 17 00:00:00 2001 From: Jon Hjelle Date: Thu, 21 Jan 2016 11:42:05 -0800 Subject: [PATCH] Update/move RTCVideoRendererAdapter to webrtc/api/objc. BUG= R=tkchin@webrtc.org Review URL: https://codereview.webrtc.org/1533323003 . Patch from Jon Hjelle . Cr-Commit-Position: refs/heads/master@{#11347} --- webrtc/api/BUILD.gn | 3 + webrtc/api/api.gyp | 3 + .../objc/RTCVideoRendererAdapter+Private.h | 42 +++++++++++++ webrtc/api/objc/RTCVideoRendererAdapter.h | 27 ++++++++ webrtc/api/objc/RTCVideoRendererAdapter.mm | 63 +++++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 webrtc/api/objc/RTCVideoRendererAdapter+Private.h create mode 100644 webrtc/api/objc/RTCVideoRendererAdapter.h create mode 100644 webrtc/api/objc/RTCVideoRendererAdapter.mm diff --git a/webrtc/api/BUILD.gn b/webrtc/api/BUILD.gn index 3775ffe013..992de03da3 100644 --- a/webrtc/api/BUILD.gn +++ b/webrtc/api/BUILD.gn @@ -59,6 +59,9 @@ if (is_ios) { "objc/RTCVideoFrame.h", "objc/RTCVideoFrame.mm", "objc/RTCVideoRenderer.h", + "objc/RTCVideoRendererAdapter+Private.h", + "objc/RTCVideoRendererAdapter.h", + "objc/RTCVideoRendererAdapter.mm", "objc/WebRTC-Prefix.pch", ] diff --git a/webrtc/api/api.gyp b/webrtc/api/api.gyp index f957f5bad8..ec88a3c5da 100644 --- a/webrtc/api/api.gyp +++ b/webrtc/api/api.gyp @@ -46,6 +46,9 @@ 'objc/RTCVideoFrame.h', 'objc/RTCVideoFrame.mm', 'objc/RTCVideoRenderer.h', + 'objc/RTCVideoRendererAdapter+Private.h', + 'objc/RTCVideoRendererAdapter.h', + 'objc/RTCVideoRendererAdapter.mm', 'objc/RTCVideoSource+Private.h', 'objc/RTCVideoSource.h', 'objc/RTCVideoSource.mm', diff --git a/webrtc/api/objc/RTCVideoRendererAdapter+Private.h b/webrtc/api/objc/RTCVideoRendererAdapter+Private.h new file mode 100644 index 0000000000..807eea4052 --- /dev/null +++ b/webrtc/api/objc/RTCVideoRendererAdapter+Private.h @@ -0,0 +1,42 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import "RTCVideoRendererAdapter.h" + +#include "talk/app/webrtc/mediastreaminterface.h" + +#import "RTCVideoRenderer.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RTCVideoRendererAdapter () + +/** + * The Objective-C video renderer passed to this adapter during construction. + * Calls made to the webrtc::VideoRenderInterface will be adapted and passed to + * this video renderer. + */ +@property(nonatomic, readonly) id videoRenderer; + +/** + * The native VideoRendererInterface surface exposed by this adapter. Calls made + * to this interface will be adapted and passed to the RTCVideoRenderer supplied + * during construction. This pointer is unsafe and owned by this class. + */ +@property(nonatomic, readonly) + webrtc::VideoRendererInterface *nativeVideoRenderer; + +/** Initialize an RTCVideoRendererAdapter with an RTCVideoRenderer. */ +- (instancetype)initWithNativeRenderer:(id)videoRenderer + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/api/objc/RTCVideoRendererAdapter.h b/webrtc/api/objc/RTCVideoRendererAdapter.h new file mode 100644 index 0000000000..434a61b2bd --- /dev/null +++ b/webrtc/api/objc/RTCVideoRendererAdapter.h @@ -0,0 +1,27 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/* + * Creates a webrtc::VideoRendererInterface surface for an RTCVideoRenderer. The + * webrtc::VideoRendererInterface is used by WebRTC rendering code - this + * adapter adapts calls made to that interface to the RTCVideoRenderer supplied + * during construction. + */ +@interface RTCVideoRendererAdapter : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/webrtc/api/objc/RTCVideoRendererAdapter.mm b/webrtc/api/objc/RTCVideoRendererAdapter.mm new file mode 100644 index 0000000000..fdaba68b9d --- /dev/null +++ b/webrtc/api/objc/RTCVideoRendererAdapter.mm @@ -0,0 +1,63 @@ +/* + * Copyright 2015 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import "RTCVideoRendererAdapter.h" + +#import "webrtc/api/objc/RTCVideoFrame+Private.h" +#import "webrtc/api/objc/RTCVideoRendererAdapter+Private.h" + +namespace webrtc { + +class VideoRendererAdapter : public VideoRendererInterface { + public: + VideoRendererAdapter(RTCVideoRendererAdapter* adapter) { + adapter_ = adapter; + size_ = CGSizeZero; + } + + void RenderFrame(const cricket::VideoFrame *nativeVideoFrame) override { + const cricket::VideoFrame *frame = + nativeVideoFrame->GetCopyWithRotationApplied(); + CGSize current_size = CGSizeMake(frame->GetWidth(), frame->GetHeight()); + if (!CGSizeEqualToSize(size_, current_size)) { + size_ = current_size; + [adapter_.videoRenderer setSize:size_]; + } + RTCVideoFrame *videoFrame = + [[RTCVideoFrame alloc] initWithNativeFrame:frame]; + [adapter_.videoRenderer renderFrame:videoFrame]; + } + + private: + __weak RTCVideoRendererAdapter *adapter_; + CGSize size_; +}; +} + +@implementation RTCVideoRendererAdapter { + rtc::scoped_ptr _adapter; +} + +@synthesize videoRenderer = _videoRenderer; + +- (instancetype)initWithNativeRenderer:(id)videoRenderer { + NSParameterAssert(videoRenderer); + if (self = [super init]) { + _videoRenderer = videoRenderer; + _adapter.reset(new webrtc::VideoRendererAdapter(self)); + } + return self; +} + +- (webrtc::VideoRendererInterface *)nativeVideoRenderer { + return _adapter.get(); +} + +@end