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