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