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