1/*
2 *  Copyright (c) 2012 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#if defined(COCOA_RENDERING)
13
14#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_MAC_VIDEO_RENDER_NSOPENGL_H_
15#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_MAC_VIDEO_RENDER_NSOPENGL_H_
16
17#import <Cocoa/Cocoa.h>
18#import <OpenGL/OpenGL.h>
19#import <OpenGL/glext.h>
20#import <OpenGL/glu.h>
21#include <QuickTime/QuickTime.h>
22#include <list>
23#include <map>
24
25#include "webrtc/modules/video_render/include/video_render_defines.h"
26
27#import "webrtc/modules/video_render/mac/cocoa_full_screen_window.h"
28#import "webrtc/modules/video_render/mac/cocoa_render_view.h"
29
30class Trace;
31
32namespace webrtc {
33class EventWrapper;
34class ThreadWrapper;
35class VideoRenderNSOpenGL;
36class CriticalSectionWrapper;
37
38class VideoChannelNSOpenGL : public VideoRenderCallback
39{
40
41public:
42
43    VideoChannelNSOpenGL(NSOpenGLContext *nsglContext, int iId, VideoRenderNSOpenGL* owner);
44    virtual ~VideoChannelNSOpenGL();
45
46    // A new frame is delivered
47    virtual int DeliverFrame(const I420VideoFrame& videoFrame);
48
49    // Called when the incomming frame size and/or number of streams in mix changes
50    virtual int FrameSizeChange(int width, int height, int numberOfStreams);
51
52    virtual int UpdateSize(int width, int height);
53
54    // Setup
55    int SetStreamSettings(int streamId, float startWidth, float startHeight, float stopWidth, float stopHeight);
56    int SetStreamCropSettings(int streamId, float startWidth, float startHeight, float stopWidth, float stopHeight);
57
58    // Called when it's time to render the last frame for the channel
59    int RenderOffScreenBuffer();
60
61    // Returns true if a new buffer has been delivered to the texture
62    int IsUpdated(bool& isUpdated);
63    virtual int UpdateStretchSize(int stretchHeight, int stretchWidth);
64
65    // ********** new module functions ************ //
66    virtual int32_t RenderFrame(const uint32_t streamId,
67                                I420VideoFrame& videoFrame);
68
69    // ********** new module helper functions ***** //
70    int ChangeContext(NSOpenGLContext *nsglContext);
71    int32_t GetChannelProperties(float& left,
72                                 float& top,
73                                 float& right,
74                                 float& bottom);
75
76private:
77
78    NSOpenGLContext* _nsglContext;
79    int _id;
80    VideoRenderNSOpenGL* _owner;
81    int32_t _width;
82    int32_t _height;
83    float _startWidth;
84    float _startHeight;
85    float _stopWidth;
86    float _stopHeight;
87    int _stretchedWidth;
88    int _stretchedHeight;
89    int _oldStretchedHeight;
90    int _oldStretchedWidth;
91    unsigned char* _buffer;
92    int _bufferSize;
93    int _incommingBufferSize;
94    bool _bufferIsUpdated;
95    int _numberOfStreams;
96    GLenum _pixelFormat;
97    GLenum _pixelDataType;
98    unsigned int _texture;
99};
100
101class VideoRenderNSOpenGL
102{
103
104public: // methods
105    VideoRenderNSOpenGL(CocoaRenderView *windowRef, bool fullScreen, int iId);
106    ~VideoRenderNSOpenGL();
107
108    static int GetOpenGLVersion(int& nsglMajor, int& nsglMinor);
109
110    // Allocates textures
111    int Init();
112    VideoChannelNSOpenGL* CreateNSGLChannel(int streamID, int zOrder, float startWidth, float startHeight, float stopWidth, float stopHeight);
113    VideoChannelNSOpenGL* ConfigureNSGLChannel(int channel, int zOrder, float startWidth, float startHeight, float stopWidth, float stopHeight);
114    int DeleteNSGLChannel(int channel);
115    int DeleteAllNSGLChannels();
116    int StopThread();
117    bool IsFullScreen();
118    bool HasChannels();
119    bool HasChannel(int channel);
120    int GetChannels(std::list<int>& channelList);
121    void LockAGLCntx();
122    void UnlockAGLCntx();
123
124    // ********** new module functions ************ //
125    int ChangeWindow(CocoaRenderView* newWindowRef);
126    int32_t ChangeUniqueID(int32_t id);
127    int32_t StartRender();
128    int32_t StopRender();
129    int32_t DeleteNSGLChannel(const uint32_t streamID);
130    int32_t GetChannelProperties(const uint16_t streamId,
131                                 uint32_t& zOrder,
132                                 float& left,
133                                 float& top,
134                                 float& right,
135                                 float& bottom);
136
137    int32_t SetText(const uint8_t textId,
138                    const uint8_t* text,
139                    const int32_t textLength,
140                    const uint32_t textColorRef,
141                    const uint32_t backgroundColorRef,
142                    const float left,
143                    const float top,
144                    const float right,
145                    const float bottom);
146
147    // ********** new module helper functions ***** //
148    int configureNSOpenGLEngine();
149    int configureNSOpenGLView();
150    int setRenderTargetWindow();
151    int setRenderTargetFullScreen();
152
153protected: // methods
154    static bool ScreenUpdateThreadProc(void* obj);
155    bool ScreenUpdateProcess();
156    int GetWindowRect(Rect& rect);
157
158private: // methods
159
160    int CreateMixingContext();
161    int RenderOffScreenBuffers();
162    int DisplayBuffers();
163
164private: // variables
165
166
167    CocoaRenderView* _windowRef;
168    bool _fullScreen;
169    int _id;
170    CriticalSectionWrapper& _nsglContextCritSec;
171    ThreadWrapper* _screenUpdateThread;
172    EventWrapper* _screenUpdateEvent;
173    NSOpenGLContext* _nsglContext;
174    NSOpenGLContext* _nsglFullScreenContext;
175    CocoaFullScreenWindow* _fullScreenWindow;
176    Rect _windowRect; // The size of the window
177    int _windowWidth;
178    int _windowHeight;
179    std::map<int, VideoChannelNSOpenGL*> _nsglChannels;
180    std::multimap<int, int> _zOrderToChannel;
181    unsigned int _threadID;
182    bool _renderingIsPaused;
183    NSView* _windowRefSuperView;
184    NSRect _windowRefSuperViewFrame;
185};
186
187}  // namespace webrtc
188
189#endif   // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_MAC_VIDEO_RENDER_NSOPENGL_H_
190#endif	 // COCOA_RENDERING
191