1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 117e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/engine_configurations.h" 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(CARBON_RENDERING) 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 157e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/mac/video_render_agl.h" 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// includes 187e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 197e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 207e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h" 217e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/system_wrappers/interface/thread_wrapper.h" 227e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h" 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * VideoChannelAGL 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma mark VideoChannelAGL constructor 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoChannelAGL::VideoChannelAGL(AGLContext& aglContext, int iId, VideoRenderAGL* owner) : 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglContext( aglContext), 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _id( iId), 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner( owner), 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width( 0), 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height( 0), 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stretchedWidth( 0), 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stretchedHeight( 0), 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _startWidth( 0.0f), 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _startHeight( 0.0f), 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stopWidth( 0.0f), 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stopHeight( 0.0f), 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _xOldWidth( 0), 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _yOldHeight( 0), 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _oldStretchedHeight(0), 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _oldStretchedWidth( 0), 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _buffer( 0), 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bufferSize( 0), 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _incommingBufferSize(0), 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bufferIsUpdated( false), 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _sizeInitialized( false), 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _numberOfStreams( 0), 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bVideoSizeStartedChanging(false), 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _pixelFormat( GL_RGBA), 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _pixelDataType( GL_UNSIGNED_INT_8_8_8_8), 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _texture( 0) 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Constructor", __FUNCTION__, __LINE__); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoChannelAGL::~VideoChannelAGL() 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Destructor", __FUNCTION__, __LINE__); 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_buffer) 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete [] _buffer; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _buffer = NULL; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetCurrentContext(_aglContext); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_texture != 0) 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDeleteTextures(1, (const GLuint*) &_texture); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _texture = 0; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 83e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t VideoChannelAGL::RenderFrame(const uint32_t streamId, 84e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org I420VideoFrame& videoFrame) { 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 863bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (_width != videoFrame.width() || 873bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org _height != videoFrame.height()) { 883bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (FrameSizeChange(videoFrame.width(), videoFrame.height(), 1) == -1) { 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d FrameSize 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Change returned an error", __FUNCTION__, __LINE__); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return DeliverFrame(videoFrame); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::UpdateSize(int /*width*/, int /*height*/) 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::UpdateStretchSize(int stretchHeight, int stretchWidth) 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stretchedHeight = stretchHeight; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stretchedWidth = stretchWidth; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::FrameSizeChange(int width, int height, int numberOfStreams) 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We'll get a new frame size from VideoAPI, prepare the buffer 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (width == _width && _height == height) 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We already have a correct buffer size 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _numberOfStreams = numberOfStreams; 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width = width; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height = height; 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Delete the old buffer, create a new one with correct size. 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_buffer) 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete [] _buffer; 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bufferSize = 0; 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _incommingBufferSize = CalcBufferSize(kI420, _width, _height); 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bufferSize = CalcBufferSize(kARGB, _width, _height);//_width * _height * bytesPerPixel; 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _buffer = new unsigned char [_bufferSize]; 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(_buffer, 0, _bufferSize * sizeof(unsigned char)); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetCurrentContext(_aglContext) == false) 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Delete a possible old texture 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_texture != 0) 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDeleteTextures(1, (const GLuint*) &_texture); 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _texture = 0; 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create a new texture 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glGenTextures(1, (GLuint *) &_texture); 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLenum glErr = glGetError(); 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (glErr != GL_NO_ERROR) 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Do the setup for both textures 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Note: we setup two textures even if we're not running full screen 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glBindTexture(GL_TEXTURE_RECTANGLE_EXT, _texture); 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set texture parameters 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexParameterf(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_PRIORITY, 1.0); 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_SHARED_APPLE); 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Maximum width/height for a texture 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLint texSize; 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize); 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (texSize < _width || texSize < _height) 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Image too big for memory 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set up th texture type and size 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, // target 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 0, // level 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GL_RGBA, // internal format 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width, // width 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height, // height 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 0, // border 0/1 = off/on 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _pixelFormat, // format, GL_BGRA 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _pixelDataType, // data type, GL_UNSIGNED_INT_8_8_8_8 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _buffer); // pixel data 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glErr = glGetError(); 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (glErr != GL_NO_ERROR) 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Called from video engine when a new frame should be rendered. 2233bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.orgint VideoChannelAGL::DeliverFrame(const I420VideoFrame& videoFrame) { 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_texture == 0) { 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2313bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int length = CalcBufferSize(kI420, videoFrame.width(), videoFrame.height()); 2323bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org if (length != _incommingBufferSize) { 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Setting stride = width. 2383bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org int rgbret = ConvertFromYV12(videoFrame, kBGRA, 0, _buffer); 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (rgbret < 0) { 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetCurrentContext(_aglContext); 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Put the new frame into the graphic card texture. 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Make sure this texture is the active one 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glBindTexture(GL_TEXTURE_RECTANGLE_EXT, _texture); 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLenum glErr = glGetError(); 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (glErr != GL_NO_ERROR) { 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Copy buffer to texture 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 0, // Level, not use 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 0, // start point x, (low left of pic) 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 0, // start point y, 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width, // width 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height, // height 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _pixelFormat, // pictue format for _buffer 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _pixelDataType, // data type of _buffer 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (const GLvoid*) _buffer); // the pixel data 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (glGetError() != GL_NO_ERROR) { 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bufferIsUpdated = true; 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::RenderOffScreenBuffer() 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_texture == 0) 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLfloat xStart = 2.0f * _startWidth - 1.0f; 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLfloat xStop = 2.0f * _stopWidth - 1.0f; 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLfloat yStart = 1.0f - 2.0f * _stopHeight; 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLfloat yStop = 1.0f - 2.0f * _startHeight; 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetCurrentContext(_aglContext); 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glBindTexture(GL_TEXTURE_RECTANGLE_EXT, _texture); 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(_stretchedWidth != _oldStretchedWidth || _stretchedHeight != _oldStretchedHeight) 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glViewport(0, 0, _stretchedWidth, _stretchedHeight); 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _oldStretchedHeight = _stretchedHeight; 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _oldStretchedWidth = _stretchedWidth; 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Now really put the texture into the framebuffer 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glLoadIdentity(); 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glEnable(GL_TEXTURE_RECTANGLE_EXT); 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glBegin(GL_POLYGON); 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexCoord2f(0.0, 0.0); glVertex2f(xStart, yStop); 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexCoord2f(_width, 0.0); glVertex2f(xStop, yStop); 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexCoord2f(_width, _height); glVertex2f(xStop, yStart); 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glTexCoord2f(0.0, _height); glVertex2f(xStart, yStart); 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glEnd(); 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_TEXTURE_RECTANGLE_EXT); 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _bufferIsUpdated = false; 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::IsUpdated(bool& isUpdated) 326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org isUpdated = _bufferIsUpdated; 329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::SetStreamSettings(int /*streamId*/, float startWidth, float startHeight, float stopWidth, float stopHeight) 335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->LockAGLCntx(); 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _startWidth = startWidth; 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stopWidth = stopWidth; 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _startHeight = startHeight; 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _stopHeight = stopHeight; 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int oldWidth = _width; 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int oldHeight = _height; 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int oldNumberOfStreams = _numberOfStreams; 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width = 0; 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height = 0; 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int retVal = FrameSizeChange(oldWidth, oldHeight, oldNumberOfStreams); 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _owner->UnlockAGLCntx(); 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return retVal; 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoChannelAGL::SetStreamCropSettings(int /*streamId*/, float /*startWidth*/, float /*startHeight*/, float /*stopWidth*/, float /*stopHeight*/) 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma mark VideoRenderAGL WindowRef constructor 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoRenderAGL::VideoRenderAGL(WindowRef windowRef, bool fullscreen, int iId) : 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_hiviewRef( 0), 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowRef( windowRef), 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_fullScreen( fullscreen), 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_id( iId), 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_renderCritSec(*CriticalSectionWrapper::CreateCriticalSection()), 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_screenUpdateThread( 0), 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_screenUpdateEvent( 0), 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_isHIViewRef( false), 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_aglContext( 0), 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowWidth( 0), 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowHeight( 0), 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastWindowWidth( -1), 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastWindowHeight( -1), 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastHiViewWidth( -1), 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastHiViewHeight( -1), 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentParentWindowHeight( 0), 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentParentWindowWidth( 0), 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentParentWindowBounds( ), 384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowHasResized( false), 385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastParentWindowBounds( ), 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentHIViewBounds( ), 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastHIViewBounds( ), 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowRect( ), 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_aglChannels( ), 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_zOrderToChannel( ), 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_hiviewEventHandlerRef( NULL), 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowEventHandlerRef( NULL), 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentViewBounds( ), 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastViewBounds( ), 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_renderingIsPaused( false), 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_threadID( ) 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s"); 400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateThread = ThreadWrapper::CreateThread(ScreenUpdateThreadProc, this, kRealtimePriority); 402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent = EventWrapper::Create(); 403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(!IsValidWindowPtr(_windowRef)) 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Invalid WindowRef:0x%x", __FUNCTION__, __LINE__, _windowRef); 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s:%d WindowRef 0x%x is valid", __FUNCTION__, __LINE__, _windowRef); 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowRect(_windowRect); 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.x = 0; 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.y = 0; 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.width = 0; 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.height = 0; 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// this is a static function. It has been registered (in class constructor) to be called on various window redrawing or resizing. 423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Since it is a static method, I have passed in "this" as the userData (one and only allowed) parameter, then calling member methods on it. 424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma mark WindowRef Event Handler 425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpascal OSStatus VideoRenderAGL::sHandleWindowResized (EventHandlerCallRef /*nextHandler*/, 426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EventRef theEvent, 427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void* userData) 428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WindowRef windowRef = NULL; 430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int eventType = GetEventKind(theEvent); 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // see https://dcs.sourcerepo.com/dcs/tox_view/trunk/tox/libraries/i686-win32/include/quicktime/CarbonEvents.h for a list of codes 434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetEventParameter (theEvent, 435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventParamDirectObject, 436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org typeWindowRef, 437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NULL, 438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sizeof (WindowRef), 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NULL, 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &windowRef); 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderAGL* obj = (VideoRenderAGL*)(userData); 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool updateUI = true; 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(kEventWindowBoundsChanged == eventType) 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventWindowBoundsChanging == eventType) 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventWindowZoomed == eventType) 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventWindowExpanding == eventType) 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventWindowExpanded == eventType) 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventWindowClickResizeRgn == eventType) 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventWindowClickDragRgn == eventType) 464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org updateUI = false; 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(true == updateUI) 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org obj->ParentWindowResized(windowRef); 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org obj->UpdateClipping(); 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org obj->RenderOffScreenBuffers(); 476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return noErr; 479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma mark VideoRenderAGL HIViewRef constructor 482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoRenderAGL::VideoRenderAGL(HIViewRef windowRef, bool fullscreen, int iId) : 484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_hiviewRef( windowRef), 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowRef( 0), 486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_fullScreen( fullscreen), 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_id( iId), 488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_renderCritSec(*CriticalSectionWrapper::CreateCriticalSection()), 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_screenUpdateThread( 0), 490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_screenUpdateEvent( 0), 491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_isHIViewRef( false), 492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_aglContext( 0), 493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowWidth( 0), 494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowHeight( 0), 495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastWindowWidth( -1), 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastWindowHeight( -1), 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastHiViewWidth( -1), 498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastHiViewHeight( -1), 499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentParentWindowHeight( 0), 500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentParentWindowWidth( 0), 501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentParentWindowBounds( ), 502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowHasResized( false), 503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastParentWindowBounds( ), 504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentHIViewBounds( ), 505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastHIViewBounds( ), 506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowRect( ), 507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_aglChannels( ), 508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_zOrderToChannel( ), 509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_hiviewEventHandlerRef( NULL), 510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_windowEventHandlerRef( NULL), 511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_currentViewBounds( ), 512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lastViewBounds( ), 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_renderingIsPaused( false), 514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_threadID( ) 515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Constructor", __FUNCTION__, __LINE__); 517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // _renderCritSec = CriticalSectionWrapper::CreateCriticalSection(); 518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateThread = ThreadWrapper::CreateThread(ScreenUpdateThreadProc, this, kRealtimePriority); 520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent = EventWrapper::Create(); 521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowRect(_windowRect); 523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.x = 0; 525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.y = 0; 526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.width = 0; 527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.height = 0; 528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef NEW_HIVIEW_PARENT_EVENT_HANDLER 530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This gets the parent window of the HIViewRef that's passed in and installs a WindowRef event handler on it 531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The event handler looks for window resize events and adjusts the offset of the controls. 532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Installing Eventhandler for hiviewRef's parent window", __FUNCTION__, __LINE__); 534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static const EventTypeSpec windowEventTypes[] = 537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassWindow, kEventWindowBoundsChanged, 539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassWindow, kEventWindowBoundsChanging, 540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassWindow, kEventWindowZoomed, 541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassWindow, kEventWindowExpanded, 542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassWindow, kEventWindowClickResizeRgn, 543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassWindow, kEventWindowClickDragRgn 544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }; 545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WindowRef parentWindow = HIViewGetWindow(windowRef); 547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org InstallWindowEventHandler (parentWindow, 549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NewEventHandlerUPP (sHandleWindowResized), 550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetEventTypeCount(windowEventTypes), 551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org windowEventTypes, 552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (void *) this, // this is an arbitrary parameter that will be passed on to your event handler when it is called later 553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &_windowEventHandlerRef); 554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef NEW_HIVIEW_EVENT_HANDLER 558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Installing Eventhandler for hiviewRef", __FUNCTION__, __LINE__); 559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static const EventTypeSpec hiviewEventTypes[] = 561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassControl, kEventControlBoundsChanged, 563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventClassControl, kEventControlDraw 564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // kEventControlDragLeave 565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // kEventControlDragReceive 566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // kEventControlGetFocusPart 567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // kEventControlApplyBackground 568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // kEventControlDraw 569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // kEventControlHit 570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }; 572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewInstallEventHandler(_hiviewRef, 574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NewEventHandlerUPP(sHandleHiViewResized), 575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetEventTypeCount(hiviewEventTypes), 576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org hiviewEventTypes, 577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (void *) this, 578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &_hiviewEventHandlerRef); 579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// this is a static function. It has been registered (in constructor) to be called on various window redrawing or resizing. 584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Since it is a static method, I have passed in "this" as the userData (one and only allowed) parameter, then calling member methods on it. 585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#pragma mark HIViewRef Event Handler 586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpascal OSStatus VideoRenderAGL::sHandleHiViewResized (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) 587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //static int callbackCounter = 1; 589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewRef hiviewRef = NULL; 590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // see https://dcs.sourcerepo.com/dcs/tox_view/trunk/tox/libraries/i686-win32/include/quicktime/CarbonEvents.h for a list of codes 592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int eventType = GetEventKind(theEvent); 593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org OSStatus status = noErr; 594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org status = GetEventParameter (theEvent, 595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kEventParamDirectObject, 596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org typeControlRef, 597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NULL, 598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sizeof (ControlRef), 599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NULL, 600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &hiviewRef); 601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderAGL* obj = (VideoRenderAGL*)(userData); 603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WindowRef parentWindow = HIViewGetWindow(hiviewRef); 604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool updateUI = true; 605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(kEventControlBoundsChanged == eventType) 607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else if(kEventControlDraw == eventType) 610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org updateUI = false; 615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(true == updateUI) 618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org obj->ParentWindowResized(parentWindow); 620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org obj->UpdateClipping(); 621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org obj->RenderOffScreenBuffers(); 622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return status; 625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoRenderAGL::~VideoRenderAGL() 628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Destructor", __FUNCTION__, __LINE__); 631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef USE_EVENT_HANDLERS 634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // remove event handlers 635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org OSStatus status; 636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(_isHIViewRef) 637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org status = RemoveEventHandler(_hiviewEventHandlerRef); 639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org status = RemoveEventHandler(_windowEventHandlerRef); 643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(noErr != status) 645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(_isHIViewRef) 647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Failed to remove hiview event handler: %d", __FUNCTION__, __LINE__, (int)_hiviewEventHandlerRef); 650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Failed to remove window event handler %d", __FUNCTION__, __LINE__, (int)_windowEventHandlerRef); 654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org OSStatus status; 660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef NEW_HIVIEW_PARENT_EVENT_HANDLER 661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(_windowEventHandlerRef) 662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org status = RemoveEventHandler(_windowEventHandlerRef); 664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(status != noErr) 665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d failed to remove window event handler %d", __FUNCTION__, __LINE__, (int)_windowEventHandlerRef); 667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef NEW_HIVIEW_EVENT_HANDLER 672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(_hiviewEventHandlerRef) 673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org status = RemoveEventHandler(_hiviewEventHandlerRef); 675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(status != noErr) 676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Failed to remove hiview event handler: %d", __FUNCTION__, __LINE__, (int)_hiviewEventHandlerRef); 678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Signal event to exit thread, then delete it 683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ThreadWrapper* tmpPtr = _screenUpdateThread; 684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateThread = NULL; 685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (tmpPtr) 687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmpPtr->SetNotAlive(); 689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent->Set(); 690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent->StopTimer(); 691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (tmpPtr->Stop()) 693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete tmpPtr; 695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete _screenUpdateEvent; 697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent = NULL; 698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_aglContext != 0) 701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetCurrentContext(_aglContext); 703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglDestroyContext(_aglContext); 704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglContext = 0; 705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Delete all channels 708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it = _aglChannels.begin(); 709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (it!= _aglChannels.end()) 710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete it->second; 712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels.erase(it); 713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it = _aglChannels.begin(); 714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels.clear(); 716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Clean the zOrder map 718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::multimap<int, int>::iterator zIt = _zOrderToChannel.begin(); 719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while(zIt != _zOrderToChannel.end()) 720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _zOrderToChannel.erase(zIt); 722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org zIt = _zOrderToChannel.begin(); 723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _zOrderToChannel.clear(); 725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //delete _renderCritSec; 727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::GetOpenGLVersion(int& aglMajor, int& aglMinor) 732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglGetVersion((GLint *) &aglMajor, (GLint *) &aglMinor); 734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::Init() 738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Start rendering thread... 742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_screenUpdateThread) 743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, "%s:%d Thread not created", __FUNCTION__, __LINE__); 746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int threadId; 749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateThread->Start(threadId); 750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Start the event triggering the render process 752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int monitorFreq = 60; 753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent->StartTimer(true, 1000/monitorFreq); 754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create mixing textures 756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (CreateMixingContext() == -1) 757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, "%s:%d Could not create a mixing context", __FUNCTION__, __LINE__); 759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoChannelAGL* VideoRenderAGL::CreateAGLChannel(int channel, int zOrder, float startWidth, float startHeight, float stopWidth, float stopHeight) 768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, "%s:%d Creating AGL channel: %d", __FUNCTION__, __LINE__, channel); 773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (HasChannel(channel)) 775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, "%s:%d Channel already exists", __FUNCTION__, __LINE__); 777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx();k 778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_zOrderToChannel.find(zOrder) != _zOrderToChannel.end()) 782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // There are already one channel using this zOrder 784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO: Allow multiple channels with same zOrder 785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoChannelAGL* newAGLChannel = new VideoChannelAGL(_aglContext, _id, this); 788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (newAGLChannel->SetStreamSettings(0, startWidth, startHeight, stopWidth, stopHeight) == -1) 790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (newAGLChannel) 792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete newAGLChannel; 794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org newAGLChannel = NULL; 795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not create AGL channel"); 797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, "%s:%d Could not create AGL channel", __FUNCTION__, __LINE__); 798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgk 802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels[channel] = newAGLChannel; 803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _zOrderToChannel.insert(std::pair<int, int>(zOrder, channel)); 804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return newAGLChannel; 807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::DeleteAllAGLChannels() 810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, "%s:%d Deleting all AGL channels", __FUNCTION__, __LINE__); 814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //int i = 0 ; 815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it; 816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it = _aglChannels.begin(); 817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (it != _aglChannels.end()) 819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoChannelAGL* channel = it->second; 821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (channel) 822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete channel; 823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels.erase(it); 825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it = _aglChannels.begin(); 826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels.clear(); 828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::DeleteAGLChannel(int channel) 832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Deleting AGL channel %d", __FUNCTION__, __LINE__, channel); 835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it; 837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it = _aglChannels.find(channel); 838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (it != _aglChannels.end()) 839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete it->second; 841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels.erase(it); 842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceWarning, "%s:%d Channel not found", __FUNCTION__, __LINE__); 846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::multimap<int, int>::iterator zIt = _zOrderToChannel.begin(); 850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while( zIt != _zOrderToChannel.end()) 851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (zIt->second == channel) 853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _zOrderToChannel.erase(zIt); 855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org zIt++;// = _zOrderToChannel.begin(); 858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::StopThread() 864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ThreadWrapper* tmpPtr = _screenUpdateThread; 867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //_screenUpdateThread = NULL; 868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (tmpPtr) 870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmpPtr->SetNotAlive(); 872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent->Set(); 873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (tmpPtr->Stop()) 874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete tmpPtr; 876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete _screenUpdateEvent; 880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent = NULL; 881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoRenderAGL::IsFullScreen() 886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _fullScreen; 889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoRenderAGL::HasChannels() 892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_aglChannels.begin() != _aglChannels.end()) 897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoRenderAGL::HasChannel(int channel) 905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it = _aglChannels.find(channel); 909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (it != _aglChannels.end()) 910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::GetChannels(std::list<int>& channelList) 918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it = _aglChannels.begin(); 922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (it != _aglChannels.end()) 924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org channelList.push_back(it->first); 926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it++; 927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoChannelAGL* VideoRenderAGL::ConfigureAGLChannel(int channel, int zOrder, float startWidth, float startHeight, float stopWidth, float stopHeight) 933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_renderCritSec); 936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it = _aglChannels.find(channel); 938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (it != _aglChannels.end()) 940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoChannelAGL* aglChannel = it->second; 942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglChannel->SetStreamSettings(0, startWidth, startHeight, stopWidth, stopHeight) == -1) 943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::multimap<int, int>::iterator it = _zOrderToChannel.begin(); 948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while(it != _zOrderToChannel.end()) 949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (it->second == channel) 951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (it->first != zOrder) 953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _zOrderToChannel.erase(it); 955b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _zOrderToChannel.insert(std::pair<int, int>(zOrder, channel)); 956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it++; 960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return aglChannel; 962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoRenderAGL::ScreenUpdateThreadProc(void* obj) 968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return static_cast<VideoRenderAGL*>(obj)->ScreenUpdateProcess(); 970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoRenderAGL::ScreenUpdateProcess() 973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent->Wait(100); 975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 978b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_screenUpdateThread) 979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetCurrentContext(_aglContext) == GL_FALSE) 985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (GetWindowRect(_windowRect) == -1) 991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_windowWidth != (_windowRect.right - _windowRect.left) 997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org || _windowHeight != (_windowRect.bottom - _windowRect.top)) 998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We have a new window size, update the context. 1000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglUpdateContext(_aglContext) == GL_FALSE) 1001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _windowWidth = _windowRect.right - _windowRect.left; 1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _windowHeight = _windowRect.bottom - _windowRect.top; 1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // this section will poll to see if the window size has changed 1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // this is causing problem w/invalid windowRef 1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // this code has been modified and exists now in the window event handler 1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef NEW_HIVIEW_PARENT_EVENT_HANDLER 1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_isHIViewRef) 1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == HIViewIsValid(_hiviewRef)) 1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Invalid windowRef", __FUNCTION__, __LINE__); 1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WindowRef window = HIViewGetWindow(_hiviewRef); 1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == IsValidWindowPtr(window)) 1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Invalide hiviewRef", __FUNCTION__, __LINE__); 1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (window == NULL) 1032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d WindowRef = NULL", __FUNCTION__, __LINE__); 1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == MacIsWindowVisible(window)) 1039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d MacIsWindowVisible == FALSE. Returning early", __FUNCTION__, __LINE__); 1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIRect viewBounds; // Placement and size for HIView 1046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int windowWidth = 0; // Parent window width 1047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int windowHeight = 0; // Parent window height 1048b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // NOTE: Calling GetWindowBounds with kWindowStructureRgn will crash intermittentaly if the OS decides it needs to push it into the back for a moment. 1050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // To counter this, we get the titlebar height on class construction and then add it to the content region here. Content regions seems not to crash 1051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Rect contentBounds = 1052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 0, 0, 0, 0}; // The bounds for the parent window 1053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(USE_CONTENT_RGN) 1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(window, kWindowContentRgn, &contentBounds); 1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(USE_STRUCT_RGN) 1057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(window, kWindowStructureRgn, &contentBounds); 1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Rect globalBounds = 1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 0, 0, 0, 0}; // The bounds for the parent window 1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org globalBounds.top = contentBounds.top; 1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org globalBounds.right = contentBounds.right; 1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org globalBounds.bottom = contentBounds.bottom; 1065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org globalBounds.left = contentBounds.left; 1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org windowHeight = globalBounds.bottom - globalBounds.top; 1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org windowWidth = globalBounds.right - globalBounds.left; 1069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the size of the HIViewRef 1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewGetBounds(_hiviewRef, &viewBounds); 1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewConvertRect(&viewBounds, _hiviewRef, NULL); 1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check if this is the first call.. 1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_lastWindowHeight == -1 && 1076b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastWindowWidth == -1) 1077b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1078b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastWindowWidth = windowWidth; 1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastWindowHeight = windowHeight; 1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.x = viewBounds.origin.x; 1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.y = viewBounds.origin.y; 1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.width = viewBounds.size.width; 1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.height = viewBounds.size.height; 1085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sfasdfasdf 1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool resized = false; 1089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1090b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check if parent window size has changed 1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (windowHeight != _lastWindowHeight || 1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org windowWidth != _lastWindowWidth) 1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org resized = true; 1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check if the HIView has new size or is moved in the parent window 1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_lastViewBounds.origin.x != viewBounds.origin.x || 1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.y != viewBounds.origin.y || 1100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.width != viewBounds.size.width || 1101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.height != viewBounds.size.height) 1102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The HiView is resized or has moved. 1104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org resized = true; 1105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (resized) 1108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d Window has resized", __FUNCTION__, __LINE__); 1111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Calculate offset between the windows 1113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // {x, y, widht, height}, x,y = lower left corner 1114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const GLint offs[4] = 1115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { (int)(0.5f + viewBounds.origin.x), 1116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(0.5f + windowHeight - (viewBounds.origin.y + viewBounds.size.height)), 1117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org viewBounds.size.width, viewBounds.size.height}; 1118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d contentBounds t:%d r:%d b:%d l:%d", __FUNCTION__, __LINE__, 1120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org contentBounds.top, contentBounds.right, contentBounds.bottom, contentBounds.left); 1121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d windowHeight=%d", __FUNCTION__, __LINE__, windowHeight); 1122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceDebug, "%s:%d offs[4] = %d, %d, %d, %d", __FUNCTION__, __LINE__, offs[0], offs[1], offs[2], offs[3]); 1123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetDrawable (_aglContext, GetWindowPort(window)); 1125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetInteger(_aglContext, AGL_BUFFER_RECT, offs); 1126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglEnable(_aglContext, AGL_BUFFER_RECT); 1127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We need to change the viewport too if the HIView size has changed 1129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glViewport(0.0f, 0.0f, (GLsizei) viewBounds.size.width, (GLsizei) viewBounds.size.height); 1130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastWindowWidth = windowWidth; 1133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastWindowHeight = windowHeight; 1134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.x = viewBounds.origin.x; 1136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.origin.y = viewBounds.origin.y; 1137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.width = viewBounds.size.width; 1138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _lastViewBounds.size.height = viewBounds.size.height; 1139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 1142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_fullScreen) 1143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO 1145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We use double buffers, must always update 1146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //RenderOffScreenBuffersToBackBuffer(); 1147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check if there are any updated buffers 1151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool updated = false; 1152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO: check if window size is updated! 1154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO Improvement: Walk through the zOrder Map to only render the ones in need of update 1155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it = _aglChannels.begin(); 1156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (it != _aglChannels.end()) 1157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoChannelAGL* aglChannel = it->second; 1160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglChannel->UpdateStretchSize(_windowHeight, _windowWidth); 1161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglChannel->IsUpdated(updated); 1162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (updated) 1163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it++; 1167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (updated) 1170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // At least on buffers is updated, we need to repaint the texture 1172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (RenderOffScreenBuffers() != -1) 1173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // MF 1175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //SwapAndDisplayBuffers(); 1176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Error updating the mixing texture, don't swap. 1180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Leaving ScreenUpdateProcess()"); 1187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VideoRenderAGL::ParentWindowResized(WindowRef window) 1191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "%s HIViewRef:%d owner window has resized", __FUNCTION__, (int)_hiviewRef); 1193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgk 1196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // set flag 1197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _windowHasResized = false; 1198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == HIViewIsValid(_hiviewRef)) 1200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "invalid windowRef"); 1202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 1204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == IsValidWindowPtr(window)) 1207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "invalid windowRef"); 1209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 1211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (window == NULL) 1214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "windowRef = NULL"); 1216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 1218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == MacIsWindowVisible(window)) 1221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "MacIsWindowVisible = FALSE. Returning early."); 1223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 1225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Rect contentBounds = 1228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 0, 0, 0, 0}; 1229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(USE_CONTENT_RGN) 1231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(window, kWindowContentRgn, &contentBounds); 1232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(USE_STRUCT_RGN) 1233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(window, kWindowStructureRgn, &contentBounds); 1234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 1235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "%s contentBounds t:%d r:%d b:%d l:%d", __FUNCTION__, contentBounds.top, contentBounds.right, contentBounds.bottom, contentBounds.left); 1237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // update global vars 1239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _currentParentWindowBounds.top = contentBounds.top; 1240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _currentParentWindowBounds.left = contentBounds.left; 1241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _currentParentWindowBounds.bottom = contentBounds.bottom; 1242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _currentParentWindowBounds.right = contentBounds.right; 1243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _currentParentWindowWidth = _currentParentWindowBounds.right - _currentParentWindowBounds.left; 1245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _currentParentWindowHeight = _currentParentWindowBounds.bottom - _currentParentWindowBounds.top; 1246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _windowHasResized = true; 1248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // ********* update AGL offsets 1250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIRect viewBounds; 1251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewGetBounds(_hiviewRef, &viewBounds); 1252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewConvertRect(&viewBounds, _hiviewRef, NULL); 1253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const GLint offs[4] = 1255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { (int)(0.5f + viewBounds.origin.x), 1256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(0.5f + _currentParentWindowHeight - (viewBounds.origin.y + viewBounds.size.height)), 1257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org viewBounds.size.width, viewBounds.size.height}; 1258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "%s _currentParentWindowHeight=%d", __FUNCTION__, _currentParentWindowHeight); 1259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "%s offs[4] = %d, %d, %d, %d", __FUNCTION__, offs[0], offs[1], offs[2], offs[3]); 1260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetCurrentContext(_aglContext); 1262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetDrawable (_aglContext, GetWindowPort(window)); 1263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetInteger(_aglContext, AGL_BUFFER_RECT, offs); 1264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglEnable(_aglContext, AGL_BUFFER_RECT); 1265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We need to change the viewport too if the HIView size has changed 1267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glViewport(0.0f, 0.0f, (GLsizei) viewBounds.size.width, (GLsizei) viewBounds.size.height); 1268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 1272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::CreateMixingContext() 1275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Entering CreateMixingContext()"); 1280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Use both AGL_ACCELERATED and AGL_NO_RECOVERY to make sure 1282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // a hardware renderer is used and not a software renderer. 1283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLint attributes[] = 1285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_DOUBLEBUFFER, 1287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_WINDOW, 1288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_RGBA, 1289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_NO_RECOVERY, 1290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_ACCELERATED, 1291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_RED_SIZE, 8, 1292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_GREEN_SIZE, 8, 1293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_BLUE_SIZE, 8, 1294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_ALPHA_SIZE, 8, 1295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_DEPTH_SIZE, 24, 1296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGL_NONE, 1297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }; 1298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AGLPixelFormat aglPixelFormat; 1300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // ***** Set up the OpenGL Context ***** 1302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get a pixel format for the attributes above 1304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglPixelFormat = aglChoosePixelFormat(NULL, 0, attributes); 1305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (NULL == aglPixelFormat) 1306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not create pixel format"); 1308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create an AGL context 1313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglContext = aglCreateContext(aglPixelFormat, NULL); 1314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_aglContext == NULL) 1315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could no create AGL context"); 1317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Release the pixel format memory 1322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglDestroyPixelFormat(aglPixelFormat); 1323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set the current AGL context for the rest of the settings 1325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetCurrentContext(_aglContext) == false) 1326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not set current context: %d", aglGetError()); 1328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_isHIViewRef) 1333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //--------------------------- 1335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // BEGIN: new test code 1336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if 0 1337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Don't use this one! 1338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // There seems to be an OS X bug that can't handle 1339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // movements and resizing of the parent window 1340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // and or the HIView 1341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetHIViewRef(_aglContext,_hiviewRef) == false) 1342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not set WindowRef: %d", aglGetError()); 1344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 1348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the parent window for this control 1350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WindowRef window = GetControlOwner(_hiviewRef); 1351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Rect globalBounds = 1353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 0,0,0,0}; // The bounds for the parent window 1354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIRect viewBounds; // Placemnt in the parent window and size. 1355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int windowHeight = 0; 1356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Rect titleBounds = {0,0,0,0}; 1358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // GetWindowBounds(window, kWindowTitleBarRgn, &titleBounds); 1359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // _titleBarHeight = titleBounds.top - titleBounds.bottom; 1360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // if(0 == _titleBarHeight) 1361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // { 1362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceError, "Titlebar height = 0"); 1363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //return -1; 1364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // } 1365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the bounds for the parent window 1368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(USE_CONTENT_RGN) 1369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(window, kWindowContentRgn, &globalBounds); 1370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(USE_STRUCT_RGN) 1371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(window, kWindowStructureRgn, &globalBounds); 1372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 1373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org windowHeight = globalBounds.bottom - globalBounds.top; 1374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the bounds for the HIView 1376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewGetBounds(_hiviewRef, &viewBounds); 1377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewConvertRect(&viewBounds, _hiviewRef, NULL); 1379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const GLint offs[4] = 1381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { (int)(0.5f + viewBounds.origin.x), 1382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (int)(0.5f + windowHeight - (viewBounds.origin.y + viewBounds.size.height)), 1383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org viewBounds.size.width, viewBounds.size.height}; 1384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "%s offs[4] = %d, %d, %d, %d", __FUNCTION__, offs[0], offs[1], offs[2], offs[3]); 1386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetDrawable (_aglContext, GetWindowPort(window)); 1389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetInteger(_aglContext, AGL_BUFFER_RECT, offs); 1390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglEnable(_aglContext, AGL_BUFFER_RECT); 1391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLint surfaceOrder = 1; // 1: above window, -1 below. 1393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //OSStatus status = aglSetInteger(_aglContext, AGL_SURFACE_ORDER, &surfaceOrder); 1394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSetInteger(_aglContext, AGL_SURFACE_ORDER, &surfaceOrder); 1395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glViewport(0.0f, 0.0f, (GLsizei) viewBounds.size.width, (GLsizei) viewBounds.size.height); 1397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 1398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(GL_FALSE == aglSetDrawable (_aglContext, GetWindowPort(_windowRef))) 1403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not set WindowRef: %d", aglGetError()); 1405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _windowWidth = _windowRect.right - _windowRect.left; 1411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _windowHeight = _windowRect.bottom - _windowRect.top; 1412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // opaque surface 1414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int surfaceOpacity = 1; 1415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetInteger(_aglContext, AGL_SURFACE_OPACITY, (const GLint *) &surfaceOpacity) == false) 1416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not set surface opacity: %d", aglGetError()); 1418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 1 -> sync to screen rat, slow... 1423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //int swapInterval = 0; // 0 don't sync with vertical trace 1424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int swapInterval = 0; // 1 sync with vertical trace 1425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetInteger(_aglContext, AGL_SWAP_INTERVAL, (const GLint *) &swapInterval) == false) 1426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not set swap interval: %d", aglGetError()); 1428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Update the rect with the current size 1433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (GetWindowRect(_windowRect) == -1) 1434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not get window size"); 1436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Disable not needed functionality to increase performance 1441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_DITHER); 1442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_ALPHA_TEST); 1443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_STENCIL_TEST); 1444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_FOG); 1445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_TEXTURE_2D); 1446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glPixelZoom(1.0, 1.0); 1447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_BLEND); 1449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_DEPTH_TEST); 1450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDepthMask(GL_FALSE); 1451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glDisable(GL_CULL_FACE); 1452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 1454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glClear(GL_COLOR_BUFFER_BIT); 1455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLenum glErr = glGetError(); 1457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (glErr) 1459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UpdateClipping(); 1463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Leaving CreateMixingContext()"); 1465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::RenderOffScreenBuffers() 1471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the current window size, it might have changed since last render. 1475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (GetWindowRect(_windowRect) == -1) 1476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not get window rect"); 1478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (aglSetCurrentContext(_aglContext) == false) 1483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "Could not set current context for rendering"); 1485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // HERE - onl if updated! 1490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glClear(GL_COLOR_BUFFER_BIT); 1491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Loop through all channels starting highest zOrder ending with lowest. 1493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (std::multimap<int, int>::reverse_iterator rIt = _zOrderToChannel.rbegin(); 1494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rIt != _zOrderToChannel.rend(); 1495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rIt++) 1496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int channelId = rIt->second; 1498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it = _aglChannels.find(channelId); 1499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoChannelAGL* aglChannel = it->second; 1501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglChannel->RenderOffScreenBuffer(); 1503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SwapAndDisplayBuffers(); 1506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::SwapAndDisplayBuffers() 1512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_fullScreen) 1516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO: 1518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Swap front and back buffers, rendering taking care of in the same call 1519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //aglSwapBuffers(_aglContext); 1520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Update buffer index to the idx for the next rendering! 1521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //_textureIdx = (_textureIdx + 1) & 1; 1522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Single buffer rendering, only update context. 1526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org glFlush(); 1527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org aglSwapBuffers(_aglContext); 1528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewSetNeedsDisplay(_hiviewRef, true); 1529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::GetWindowRect(Rect& rect) 1536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_isHIViewRef) 1541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_hiviewRef) 1543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIRect HIViewRect1; 1545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == HIViewIsValid(_hiviewRef)) 1546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.top = 0; 1548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.left = 0; 1549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.right = 0; 1550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.bottom = 0; 1551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError,"GetWindowRect() HIViewIsValid() returned false"); 1552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIViewGetBounds(_hiviewRef,&HIViewRect1); 1555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org HIRectConvert(&HIViewRect1, 1, NULL, 2, NULL); 1556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(HIViewRect1.origin.x < 0) 1557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.top = 0; 1559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "GetWindowRect() rect.top = 0"); 1560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.top = HIViewRect1.origin.x; 1564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(HIViewRect1.origin.y < 0) 1567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.left = 0; 1569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "GetWindowRect() rect.left = 0"); 1570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.left = HIViewRect1.origin.y; 1574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(HIViewRect1.size.width < 0) 1577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.right = 0; 1579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "GetWindowRect() rect.right = 0"); 1580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.right = HIViewRect1.size.width; 1584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(HIViewRect1.size.height < 0) 1587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.bottom = 0; 1589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "GetWindowRect() rect.bottom = 0"); 1590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rect.bottom = HIViewRect1.size.height; 1594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ////WEBRTC_LOG(kTraceDebug,"GetWindowRect() HIViewRef: rect.top = %d, rect.left = %d, rect.right = %d, rect.bottom =%d in GetWindowRect", rect.top,rect.left,rect.right,rect.bottom); 1597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "invalid HIViewRef"); 1602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_windowRef) 1608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetWindowBounds(_windowRef, kWindowContentRgn, &rect); 1610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "No WindowRef"); 1615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::UpdateClipping() 1621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Entering UpdateClipping()"); 1623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(_isHIViewRef) 1626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == HIViewIsValid(_hiviewRef)) 1628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "UpdateClipping() _isHIViewRef is invalid. Returning -1"); 1630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RgnHandle visibleRgn = NewRgn(); 1635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetEmptyRgn (visibleRgn); 1636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(-1 == CalculateVisibleRegion((ControlRef)_hiviewRef, visibleRgn, true)) 1638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(GL_FALSE == aglSetCurrentContext(_aglContext)) 1642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLenum glErr = aglGetError(); 1644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "aglSetCurrentContext returned FALSE with error code %d at line %d", glErr, __LINE__); 1645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(GL_FALSE == aglEnable(_aglContext, AGL_CLIP_REGION)) 1648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLenum glErr = aglGetError(); 1650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "aglEnable returned FALSE with error code %d at line %d\n", glErr, __LINE__); 1651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(GL_FALSE == aglSetInteger(_aglContext, AGL_CLIP_REGION, (const GLint*)visibleRgn)) 1654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GLenum glErr = aglGetError(); 1656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "aglSetInteger returned FALSE with error code %d at line %d\n", glErr, __LINE__); 1657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DisposeRgn(visibleRgn); 1660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Not using a hiviewref!\n"); 1664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Leaving UpdateClipping()"); 1667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::CalculateVisibleRegion(ControlRef control, RgnHandle &visibleRgn, bool clipChildren) 1672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // LockAGLCntx(); 1675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Entering CalculateVisibleRegion()"); 1677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org OSStatus osStatus = 0; 1678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org OSErr osErr = 0; 1679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RgnHandle tempRgn = NewRgn(); 1681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (IsControlVisible(control)) 1682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RgnHandle childRgn = NewRgn(); 1684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WindowRef window = GetControlOwner(control); 1685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ControlRef rootControl; 1686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetRootControl(window, &rootControl); // 'wvnc' 1687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ControlRef masterControl; 1688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osStatus = GetSuperControl(rootControl, &masterControl); 1689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM GetSuperControl=%d", osStatus); 1690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (masterControl != NULL) 1692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(visibleRgn); 1694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // init visibleRgn with region of 'wvnc' 1695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osStatus = GetControlRegion(rootControl, kControlStructureMetaPart, visibleRgn); 1696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM GetControlRegion=%d : %d", osStatus, __LINE__); 1697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //GetSuperControl(rootControl, &rootControl); 1698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ControlRef tempControl = control, lastControl = 0; 1699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (tempControl != masterControl) // current control != master 1700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM tempControl=%d masterControl=%d", tempControl, masterControl); 1705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ControlRef subControl; 1706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osStatus = GetControlRegion(tempControl, kControlStructureMetaPart, tempRgn); // intersect the region of the current control with visibleRgn 1708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM GetControlRegion=%d : %d", osStatus, __LINE__); 1709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osErr = HIViewConvertRegion(tempRgn, tempControl, rootControl); 1712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM HIViewConvertRegion=%d : %d", osErr, __LINE__); 1713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SectRgn(tempRgn, visibleRgn, visibleRgn); 1716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(visibleRgn); 1718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (EmptyRgn(visibleRgn)) // if the region is empty, bail 1719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (clipChildren || tempControl != control) // clip children if true, cut out the tempControl if it's not one passed to this function 1722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UInt16 numChildren; 1725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osStatus = CountSubControls(tempControl, &numChildren); // count the subcontrols 1726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM CountSubControls=%d : %d", osStatus, __LINE__); 1727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM numChildren=%d", numChildren); 1729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < numChildren; i++) 1730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osErr = GetIndexedSubControl(tempControl, numChildren - i, &subControl); // retrieve the subcontrol in order by zorder 1732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM GetIndexedSubControls=%d : %d", osErr, __LINE__); 1733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ( subControl == lastControl ) // break because of zorder 1734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM breaking because of zorder %d", __LINE__); 1737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!IsControlVisible(subControl)) // dont' clip invisible controls 1741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM continue. Control is not visible %d", __LINE__); 1744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org continue; 1745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(!subControl) continue; 1748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osStatus = GetControlRegion(subControl, kControlStructureMetaPart, tempRgn); //get the region of the current control and union to childrg 1750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM GetControlRegion=%d %d", osStatus, __LINE__); 1751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(osStatus != 0) 1753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM ERROR! osStatus=%d. Continuing. %d", osStatus, __LINE__); 1755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org continue; 1756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(!tempRgn) 1758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM ERROR! !tempRgn %d", osStatus, __LINE__); 1760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org continue; 1761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org osStatus = HIViewConvertRegion(tempRgn, subControl, rootControl); 1764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM HIViewConvertRegion=%d %d", osStatus, __LINE__); 1766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(osStatus != 0) 1767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM ERROR! osStatus=%d. Continuing. %d", osStatus, __LINE__); 1769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org continue; 1770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(!rootControl) 1772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM ERROR! !rootControl %d", osStatus, __LINE__); 1774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org continue; 1775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnionRgn(tempRgn, childRgn, childRgn); 1778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(childRgn); 1780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(visibleRgn); 1781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(!childRgn) 1782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM ERROR! !childRgn %d", osStatus, __LINE__); 1784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org continue; 1785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 17873b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org } // next child control 1788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lastControl = tempControl; 1790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetSuperControl(tempControl, &subControl); 1791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tempControl = subControl; 1792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DiffRgn(visibleRgn, childRgn, visibleRgn); 1795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(visibleRgn); 1796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(childRgn); 1797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DisposeRgn(childRgn); 1798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CopyRgn(tempRgn, visibleRgn); 1802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(tempRgn); 1803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CheckValidRegion(visibleRgn); 1804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DisposeRgn(tempRgn); 1806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceDebug, "Leaving CalculateVisibleRegion()"); 1809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //_aglCritPtr->Leave(); 1810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoRenderAGL::CheckValidRegion(RgnHandle rHandle) 1814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Handle hndSize = (Handle)rHandle; 1817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org long size = GetHandleSize(hndSize); 1818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(0 == size) 1819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org OSErr memErr = MemError(); 1822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(noErr != memErr) 1823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceError, "IBM ERROR Could not get size of handle. MemError() returned %d", memErr); 1825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceError, "IBM ERROR Could not get size of handle yet MemError() returned noErr"); 1829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 1833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceDebug, "IBM handleSize = %d", size); 1835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(false == IsValidRgnHandle(rHandle)) 1838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // //WEBRTC_LOG(kTraceError, "IBM ERROR Invalid Region found : $%d", rHandle); 1840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(false); 1841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int err = QDError(); 1844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch(err) 1845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 0: 1847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case -147: 1849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "ERROR region too big"); 1850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(false); 1851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case -149: 1854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "ERROR not enough stack"); 1855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(false); 1856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org default: 1859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_LOG(kTraceError, "ERROR Unknown QDError %d", err); 1860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(false); 1861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 1862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 1865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoRenderAGL::ChangeWindow(void* newWindowRef) 1868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1875e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t VideoRenderAGL::ChangeUniqueID(int32_t id) 1876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1883e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t VideoRenderAGL::StartRender() 1884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const unsigned int MONITOR_FREQ = 60; 1888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(TRUE == _renderingIsPaused) 1889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Rendering is paused. Restarting now", __FUNCTION__, __LINE__); 1891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // we already have the thread. Most likely StopRender() was called and they were paused 1893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == _screenUpdateThread->Start(_threadID)) 1894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Failed to start screenUpdateThread", __FUNCTION__, __LINE__); 1896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == _screenUpdateEvent->StartTimer(true, 1000/MONITOR_FREQ)) 1900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Failed to start screenUpdateEvent", __FUNCTION__, __LINE__); 1902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateThread = ThreadWrapper::CreateThread(ScreenUpdateThreadProc, this, kRealtimePriority); 1910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent = EventWrapper::Create(); 1911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_screenUpdateThread) 1913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Failed to start screenUpdateThread", __FUNCTION__, __LINE__); 1915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateThread->Start(_threadID); 1920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _screenUpdateEvent->StartTimer(true, 1000/MONITOR_FREQ); 1921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Started screenUpdateThread", __FUNCTION__, __LINE__); 1923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1929e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t VideoRenderAGL::StopRender() 1930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(!_screenUpdateThread || !_screenUpdateEvent) 1934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _renderingIsPaused = TRUE; 1936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(FALSE == _screenUpdateThread->Stop() || FALSE == _screenUpdateEvent->StopTimer()) 1941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _renderingIsPaused = FALSE; 1943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Could not stop either: screenUpdateThread or screenUpdateEvent", __FUNCTION__, __LINE__); 1944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _renderingIsPaused = TRUE; 1949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Stopped screenUpdateThread", __FUNCTION__, __LINE__); 1951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1955e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t VideoRenderAGL::DeleteAGLChannel(const uint32_t streamID) 1956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::map<int, VideoChannelAGL*>::iterator it; 1961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it = _aglChannels.begin(); 1962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (it != _aglChannels.end()) 1964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 1965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoChannelAGL* channel = it->second; 1966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Deleting channel %d", __FUNCTION__, __LINE__, streamID); 1967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete channel; 1968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org it++; 1969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _aglChannels.clear(); 1971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 1974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1976e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t VideoRenderAGL::GetChannelProperties(const uint16_t streamId, 1977e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t& zOrder, 1978e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float& left, 1979e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float& top, 1980e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float& right, 1981e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float& bottom) 1982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LockAGLCntx(); 1985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org UnlockAGLCntx(); 1986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VideoRenderAGL::LockAGLCntx() 1991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _renderCritSec.Enter(); 1993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VideoRenderAGL::UnlockAGLCntx() 1995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 1996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _renderCritSec.Leave(); 1997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 1998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19993b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 2000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 2001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // CARBON_RENDERING 2002