blob: f79aecf9161bdb95b97f9a3cf876d58d168b7006 [file] [log] [blame]
mflodman@webrtc.org7f944f32013-05-27 15:52:38 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000011#include "webrtc/test/mac/video_renderer_mac.h"
mflodman@webrtc.org7f944f32013-05-27 15:52:38 +000012
13#import <Cocoa/Cocoa.h>
14
15// Creates a Cocoa Window with an OpenGL context, used together with an OpenGL
16// renderer.
17@interface CocoaWindow : NSObject {
18 @private
19 NSWindow *window_;
20 NSOpenGLContext *context_;
21 NSString *title_;
22 int width_;
23 int height_;
24}
25
26- (id)initWithTitle:(NSString *)title width:(int)width height:(int)height;
27// 'createWindow' must be called on the main thread.
28- (void)createWindow:(NSObject *)ignored;
29- (void)makeCurrentContext;
30
31@end
32
33@implementation CocoaWindow
34 static NSInteger nextXOrigin_;
35 static NSInteger nextYOrigin_;
36
37- (id)initWithTitle:(NSString *)title width:(int)width height:(int)height {
38 if (self = [super init]) {
39 title_ = title;
40 width_ = width;
41 height_ = height;
42 }
43 return self;
44}
45
46- (void)dealloc {
47 [window_ release];
48 [super dealloc];
49}
50
51- (void)createWindow:(NSObject *)ignored {
52 NSInteger xOrigin = nextXOrigin_;
53 NSRect screenFrame = [[NSScreen mainScreen] frame];
54 if (nextXOrigin_ + width_ < screenFrame.size.width) {
55 nextXOrigin_ += width_;
56 } else {
57 xOrigin = 0;
58 nextXOrigin_ = 0;
59 nextYOrigin_ += height_;
60 }
61 if (nextYOrigin_ + height_ > screenFrame.size.height) {
62 xOrigin = 0;
63 nextXOrigin_ = 0;
64 nextYOrigin_ = 0;
65 }
66 NSInteger yOrigin = nextYOrigin_;
67 NSRect windowFrame = NSMakeRect(xOrigin, yOrigin, width_, height_);
68 window_ = [[NSWindow alloc] initWithContentRect:windowFrame
69 styleMask:NSTitledWindowMask
70 backing:NSBackingStoreBuffered
71 defer:NO];
72
73 NSRect viewFrame = NSMakeRect(0, 0, width_, height_);
74 NSOpenGLView *view = [[[NSOpenGLView alloc] initWithFrame:viewFrame
75 pixelFormat:nil] autorelease];
76 context_ = [view openGLContext];
77
78 [[window_ contentView] addSubview:view];
79 [window_ setTitle:title_];
80 [window_ makeKeyAndOrderFront:NSApp];
81}
82
83- (void)makeCurrentContext {
84 [context_ makeCurrentContext];
85}
86
87@end
88
89namespace webrtc {
90namespace test {
91
92VideoRenderer* VideoRenderer::CreatePlatformRenderer(const char* window_title,
93 size_t width,
94 size_t height) {
95 MacRenderer* renderer = new MacRenderer();
96 if (!renderer->Init(window_title, width, height)) {
97 delete renderer;
98 return NULL;
99 }
100 return renderer;
101}
102
103MacRenderer::MacRenderer()
104 : window_(NULL) {}
105
106MacRenderer::~MacRenderer() {
107 GlRenderer::Destroy();
108 [window_ release];
109}
110
111bool MacRenderer::Init(const char* window_title, int width, int height) {
112 window_ = [[CocoaWindow alloc]
113 initWithTitle:[NSString stringWithUTF8String:window_title]
114 width:width
115 height:height];
116 if (!window_)
117 return false;
118 [window_ performSelectorOnMainThread:@selector(createWindow:)
119 withObject:nil
120 waitUntilDone:YES];
121
122 [window_ makeCurrentContext];
123 GlRenderer::Init();
124 GlRenderer::ResizeViewport(width, height);
125 return true;
126}
127
nisseeb83a1a2016-03-21 01:27:56 -0700128void MacRenderer::OnFrame(const VideoFrame& frame) {
mflodman@webrtc.org7f944f32013-05-27 15:52:38 +0000129 [window_ makeCurrentContext];
nisseeb83a1a2016-03-21 01:27:56 -0700130 GlRenderer::OnFrame(frame);
mflodman@webrtc.org7f944f32013-05-27 15:52:38 +0000131}
132
133} // test
134} // webrtc