1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 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 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_MAC_VIDEO_RENDER_AGL_H_ 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_MAC_VIDEO_RENDER_AGL_H_ 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 187e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/include/video_render_defines.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define NEW_HIVIEW_PARENT_EVENT_HANDLER 1 21e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org#define NEW_HIVIEW_EVENT_HANDLER 1 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define USE_STRUCT_RGN 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <AGL/agl.h> 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <Carbon/Carbon.h> 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <OpenGL/OpenGL.h> 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <OpenGL/glext.h> 287e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include <OpenGL/glu.h> 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <list> 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <map> 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoRenderAGL; 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper; 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgclass VideoChannelAGL : public VideoRenderCallback { 40e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org public: 41e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 42e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoChannelAGL(AGLContext& aglContext, int iId, VideoRenderAGL* owner); 43e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual ~VideoChannelAGL(); 44e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int FrameSizeChange(int width, int height, int numberOfStreams); 45e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int DeliverFrame(const I420VideoFrame& videoFrame); 46e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int UpdateSize(int width, int height); 47e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int SetStreamSettings(int streamId, float startWidth, float startHeight, 48e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float stopWidth, float stopHeight); 49e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int SetStreamCropSettings(int streamId, float startWidth, float startHeight, 50e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float stopWidth, float stopHeight); 51e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int RenderOffScreenBuffer(); 52e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int IsUpdated(bool& isUpdated); 53e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int UpdateStretchSize(int stretchHeight, int stretchWidth); 54e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org virtual int32_t RenderFrame(const uint32_t streamId, 55e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org I420VideoFrame& videoFrame); 56e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 57e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org private: 58e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 59e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org AGLContext _aglContext; 60e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _id; 61e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoRenderAGL* _owner; 62e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _width; 63e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _height; 64e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _stretchedWidth; 65e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _stretchedHeight; 66e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float _startHeight; 67e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float _startWidth; 68e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float _stopWidth; 69e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float _stopHeight; 70e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _xOldWidth; 71e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _yOldHeight; 72e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _oldStretchedHeight; 73e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _oldStretchedWidth; 74e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org unsigned char* _buffer; 75e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _bufferSize; 76e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _incommingBufferSize; 77e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _bufferIsUpdated; 78e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _sizeInitialized; 79e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _numberOfStreams; 80e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _bVideoSizeStartedChanging; 81e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org GLenum _pixelFormat; 82e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org GLenum _pixelDataType; 83e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org unsigned int _texture; 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 86e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgclass VideoRenderAGL { 87e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org public: 88e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoRenderAGL(WindowRef windowRef, bool fullscreen, int iId); 89e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoRenderAGL(HIViewRef windowRef, bool fullscreen, int iId); 90e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org ~VideoRenderAGL(); 91e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 92e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int Init(); 93e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoChannelAGL* CreateAGLChannel(int channel, int zOrder, float startWidth, 94e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float startHeight, float stopWidth, 95e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float stopHeight); 96e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org VideoChannelAGL* ConfigureAGLChannel(int channel, int zOrder, 97e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float startWidth, float startHeight, 98e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float stopWidth, float stopHeight); 99e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int DeleteAGLChannel(int channel); 100e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int DeleteAllAGLChannels(); 101e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int StopThread(); 102e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool IsFullScreen(); 103e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool HasChannels(); 104e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool HasChannel(int channel); 105e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int GetChannels(std::list<int>& channelList); 106e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org void LockAGLCntx(); 107e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org void UnlockAGLCntx(); 108e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 109e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org static int GetOpenGLVersion(int& aglMajor, int& aglMinor); 110e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 111e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org // ********** new module functions ************ // 112e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int ChangeWindow(void* newWindowRef); 113e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t ChangeUniqueID(int32_t id); 114e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t StartRender(); 115e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t StopRender(); 116e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t DeleteAGLChannel(const uint32_t streamID); 117e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int32_t GetChannelProperties(const uint16_t streamId, uint32_t& zOrder, 118e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float& left, float& top, float& right, 119e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org float& bottom); 120e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 121e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org protected: 122e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org static bool ScreenUpdateThreadProc(void* obj); 123e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool ScreenUpdateProcess(); 124e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int GetWindowRect(Rect& rect); 125e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 126e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org private: 127e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int CreateMixingContext(); 128e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int RenderOffScreenBuffers(); 129e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int SwapAndDisplayBuffers(); 130e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int UpdateClipping(); 131e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int CalculateVisibleRegion(ControlRef control, RgnHandle& visibleRgn, 132e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool clipChildren); 133e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool CheckValidRegion(RgnHandle rHandle); 134e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org void ParentWindowResized(WindowRef window); 135e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 136e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org // Carbon GUI event handlers 137e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org static pascal OSStatus sHandleWindowResized( 138e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); 139e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org static pascal OSStatus sHandleHiViewResized( 140e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); 141e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org 142e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org HIViewRef _hiviewRef; 143e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org WindowRef _windowRef; 144e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _fullScreen; 145e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _id; 146e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org webrtc::CriticalSectionWrapper& _renderCritSec; 147e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org webrtc::ThreadWrapper* _screenUpdateThread; 148e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org webrtc::EventWrapper* _screenUpdateEvent; 149e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _isHIViewRef; 150e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org AGLContext _aglContext; 151e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _windowWidth; 152e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _windowHeight; 153e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _lastWindowWidth; 154e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _lastWindowHeight; 155e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _lastHiViewWidth; 156e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _lastHiViewHeight; 157e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _currentParentWindowHeight; 158e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org int _currentParentWindowWidth; 159e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org Rect _currentParentWindowBounds; 160e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _windowHasResized; 161e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org Rect _lastParentWindowBounds; 162e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org Rect _currentHIViewBounds; 163e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org Rect _lastHIViewBounds; 164e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org Rect _windowRect; 165e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org std::map<int, VideoChannelAGL*> _aglChannels; 166e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org std::multimap<int, int> _zOrderToChannel; 167e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org EventHandlerRef _hiviewEventHandlerRef; 168e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org EventHandlerRef _windowEventHandlerRef; 169e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org HIRect _currentViewBounds; 170e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org HIRect _lastViewBounds; 171e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org bool _renderingIsPaused; 172e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org unsigned int _threadID; 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1763b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 178e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org#endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_MAC_VIDEO_RENDER_AGL_H_ 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 180e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org#endif // CARBON_RENDERING 181