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