#endif
#import "RTCVideoRenderer+Internal.h"
+#import "RTCI420Frame+Internal.h"
-#if TARGET_OS_IPHONE
-#import <UIKit/UIKit.h>
+namespace webrtc {
-#import "RTCI420Frame.h"
-#import "RTCVideoRendererDelegate.h"
-
-#import "webrtc/modules/video_render/ios/video_render_ios_impl.h"
-#import "webrtc/modules/video_render/ios/video_render_ios_view.h"
-
-#include "common_video/interface/i420_video_frame.h"
-#include "talk/app/webrtc/mediastreaminterface.h"
-#include "talk/media/base/videoframe.h"
-#include "webrtc/modules/video_render/include/video_render_defines.h"
-
-// An adapter presenting VideoRendererInterface's API and delegating to
-// a VideoRenderCallback. Suitable for feeding to
-// VideoTrackInterface::AddRenderer().
-class CallbackConverter : public webrtc::VideoRendererInterface {
+class RTCVideoRendererAdapter : public VideoRendererInterface {
public:
- CallbackConverter(webrtc::VideoRenderCallback* callback,
- const uint32_t streamId)
- : callback_(callback), streamId_(streamId) {}
-
- virtual void SetSize(int width, int height) {};
- virtual void RenderFrame(const cricket::VideoFrame* frame) {
- // Make this into an I420VideoFrame.
- size_t width = frame->GetWidth();
- size_t height = frame->GetHeight();
-
- size_t y_plane_size = width * height;
- size_t uv_plane_size = frame->GetChromaSize();
-
- webrtc::I420VideoFrame i420Frame;
- i420Frame.CreateFrame(y_plane_size,
- frame->GetYPlane(),
- uv_plane_size,
- frame->GetUPlane(),
- uv_plane_size,
- frame->GetVPlane(),
- width,
- height,
- frame->GetYPitch(),
- frame->GetUPitch(),
- frame->GetVPitch());
+ RTCVideoRendererAdapter(RTCVideoRenderer* renderer) { _renderer = renderer; }
- i420Frame.set_render_time_ms(frame->GetTimeStamp() / 1000000);
+ virtual void SetSize(int width, int height) OVERRIDE {
+ [_renderer.delegate renderer:_renderer
+ didSetSize:CGSizeMake(width, height)];
+ }
- callback_->RenderFrame(streamId_, i420Frame);
+ virtual void RenderFrame(const cricket::VideoFrame* frame) OVERRIDE {
+ if (!_renderer.delegate) {
+ return;
+ }
+ RTCI420Frame* i420Frame = [[RTCI420Frame alloc] initWithVideoFrame:frame];
+ [_renderer.delegate renderer:_renderer didReceiveFrame:i420Frame];
}
private:
- webrtc::VideoRenderCallback* callback_;
- const uint32_t streamId_;
+ __weak RTCVideoRenderer* _renderer;
};
-
-@implementation RTCVideoRenderer {
- VideoRenderIosView* _renderView;
- UIActivityIndicatorView* _activityIndicator;
- CallbackConverter* _converter;
- talk_base::scoped_ptr<webrtc::VideoRenderIosImpl> _iosRenderer;
}
-@synthesize delegate = _delegate;
-
-- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate {
- // TODO(hughv): Create video renderer.
- [self doesNotRecognizeSelector:_cmd];
- return self;
+@implementation RTCVideoRenderer {
+ rtc::scoped_ptr<webrtc::RTCVideoRendererAdapter> _adapter;
}
-- (id)initWithView:(UIView*)view {
- if ((self = [super init])) {
- CGRect frame =
- CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height);
- _renderView = [[VideoRenderIosView alloc] initWithFrame:frame];
- _iosRenderer.reset(
- new webrtc::VideoRenderIosImpl(0, (__bridge void*)_renderView, NO));
- if (_iosRenderer->Init() == -1) {
- self = nil;
- } else {
- webrtc::VideoRenderCallback* callback =
- _iosRenderer->AddIncomingRenderStream(0, 1, 0, 0, 1, 1);
- _converter = new CallbackConverter(callback, 0);
- _iosRenderer->StartRender();
- [view addSubview:_renderView];
- _renderView.autoresizingMask =
- UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
- _renderView.translatesAutoresizingMaskIntoConstraints = YES;
-
- _activityIndicator = [[UIActivityIndicatorView alloc]
- initWithActivityIndicatorStyle:
- UIActivityIndicatorViewStyleWhiteLarge];
- _activityIndicator.frame = view.bounds;
- _activityIndicator.hidesWhenStopped = YES;
- [view addSubview:_activityIndicator];
- _activityIndicator.autoresizingMask =
- UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- _activityIndicator.translatesAutoresizingMaskIntoConstraints = YES;
- [_activityIndicator startAnimating];
- }
+- (instancetype)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate {
+ if (self = [super init]) {
+ _delegate = delegate;
+ _adapter.reset(new webrtc::RTCVideoRendererAdapter(self));
}
return self;
}
-- (void)start {
- [_activityIndicator stopAnimating];
- [_activityIndicator removeFromSuperview];
- _iosRenderer->StartRender();
-}
-
-- (void)stop {
- _iosRenderer->StopRender();
-}
-
@end
@implementation RTCVideoRenderer (Internal)
- (webrtc::VideoRendererInterface*)videoRenderer {
- return _converter;
-}
-
-@end
-
-#else // TARGET_OS_IPHONE
-
-// TODO(fischman): implement an OS/X RTCVideoRenderer (and add to
-// RTCPeerConnectionTest!).
-
-#import "RTCI420Frame.h"
-#import "RTCVideoRendererDelegate.h"
-@implementation RTCVideoRenderer
-@synthesize delegate = _delegate;
-+ (RTCVideoRenderer*)videoRendererWithFrame:(CGRect)frame {
- // TODO(hughv): Implement.
- return nil;
-}
-- (id)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate {
- if ((self = [super init])) {
- _delegate = delegate;
- // TODO(hughv): Create video renderer.
- }
- return self;
-}
-- (id)initWithView:(UIView*)view {
- return nil;
-}
-- (void)setTransform:(CGAffineTransform)transform {
-}
-- (void)start {
-}
-- (void)stop {
+ return _adapter.get();
}
@end
-@implementation RTCVideoRenderer (Internal)
-- (id)initWithVideoRenderer:(webrtc::VideoRendererInterface*)videoRenderer {
- if ((self = [super init])) {
- // TODO(hughv): Implement.
- }
- return self;
-}
-- (webrtc::VideoRendererInterface*)videoRenderer {
- // TODO(hughv): Implement.
- return NULL;
-}
-@end
-
-#endif // TARGET_OS_IPHONE