Home | History | Annotate | Download | only in mac
      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 #include "webrtc/modules/video_render/mac/cocoa_render_view.h"
     15 #include "webrtc/modules/video_render/mac/video_render_mac_cocoa_impl.h"
     16 #include "webrtc/modules/video_render/mac/video_render_nsopengl.h"
     17 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
     18 #include "webrtc/system_wrappers/interface/trace.h"
     19 
     20 namespace webrtc {
     21 
     22 VideoRenderMacCocoaImpl::VideoRenderMacCocoaImpl(const int32_t id,
     23         const VideoRenderType videoRenderType,
     24         void* window,
     25         const bool fullscreen) :
     26 _id(id),
     27 _renderMacCocoaCritsect(*CriticalSectionWrapper::CreateCriticalSection()),
     28 _fullScreen(fullscreen),
     29 _ptrWindow(window)
     30 {
     31 
     32     WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "Constructor %s:%d", __FUNCTION__, __LINE__);
     33 }
     34 
     35 VideoRenderMacCocoaImpl::~VideoRenderMacCocoaImpl()
     36 {
     37     WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "Destructor %s:%d", __FUNCTION__, __LINE__);
     38     delete &_renderMacCocoaCritsect;
     39     if (_ptrCocoaRender)
     40     {
     41         delete _ptrCocoaRender;
     42         _ptrCocoaRender = NULL;
     43     }
     44 }
     45 
     46 int32_t
     47 VideoRenderMacCocoaImpl::Init()
     48 {
     49 
     50     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
     51     WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d", __FUNCTION__, __LINE__);
     52 
     53     // cast ptrWindow from void* to CocoaRenderer. Void* was once NSOpenGLView, and CocoaRenderer is NSOpenGLView.
     54     _ptrCocoaRender = new VideoRenderNSOpenGL((CocoaRenderView*)_ptrWindow, _fullScreen, _id);
     55     if (!_ptrWindow)
     56     {
     57         WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id, "Constructor %s:%d", __FUNCTION__, __LINE__);
     58         return -1;
     59     }
     60     int retVal = _ptrCocoaRender->Init();
     61     if (retVal == -1)
     62     {
     63         WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "Failed to init %s:%d", __FUNCTION__, __LINE__);
     64         return -1;
     65     }
     66 
     67     return 0;
     68 }
     69 
     70 int32_t
     71 VideoRenderMacCocoaImpl::ChangeUniqueId(const int32_t id)
     72 {
     73     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
     74     WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s", __FUNCTION__);
     75     _id = id;
     76 
     77     if(_ptrCocoaRender)
     78     {
     79         _ptrCocoaRender->ChangeUniqueID(_id);
     80     }
     81 
     82     return 0;
     83 }
     84 
     85 int32_t
     86 VideoRenderMacCocoaImpl::ChangeWindow(void* window)
     87 {
     88 
     89     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
     90     WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s changing ID to ", __FUNCTION__, window);
     91 
     92     if (window == NULL)
     93     {
     94         return -1;
     95     }
     96     _ptrWindow = window;
     97 
     98 
     99     _ptrWindow = window;
    100     _ptrCocoaRender->ChangeWindow((CocoaRenderView*)_ptrWindow);
    101 
    102     return 0;
    103 }
    104 
    105 VideoRenderCallback*
    106 VideoRenderMacCocoaImpl::AddIncomingRenderStream(const uint32_t streamId,
    107         const uint32_t zOrder,
    108         const float left,
    109         const float top,
    110         const float right,
    111         const float bottom)
    112 {
    113     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
    114     WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s", __FUNCTION__);
    115     VideoChannelNSOpenGL* nsOpenGLChannel = NULL;
    116 
    117     if(!_ptrWindow)
    118     {
    119     }
    120 
    121     if(!nsOpenGLChannel)
    122     {
    123         nsOpenGLChannel = _ptrCocoaRender->CreateNSGLChannel(streamId, zOrder, left, top, right, bottom);
    124     }
    125 
    126     return nsOpenGLChannel;
    127 
    128 }
    129 
    130 int32_t
    131 VideoRenderMacCocoaImpl::DeleteIncomingRenderStream(const uint32_t streamId)
    132 {
    133     WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "Constructor %s:%d", __FUNCTION__, __LINE__);
    134     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
    135     _ptrCocoaRender->DeleteNSGLChannel(streamId);
    136 
    137     return 0;
    138 }
    139 
    140 int32_t
    141 VideoRenderMacCocoaImpl::GetIncomingRenderStreamProperties(const uint32_t streamId,
    142         uint32_t& zOrder,
    143         float& left,
    144         float& top,
    145         float& right,
    146         float& bottom) const
    147 {
    148     return _ptrCocoaRender->GetChannelProperties(streamId, zOrder, left, top, right, bottom);
    149 }
    150 
    151 int32_t
    152 VideoRenderMacCocoaImpl::StartRender()
    153 {
    154     return _ptrCocoaRender->StartRender();
    155 }
    156 
    157 int32_t
    158 VideoRenderMacCocoaImpl::StopRender()
    159 {
    160     return _ptrCocoaRender->StopRender();
    161 }
    162 
    163 VideoRenderType
    164 VideoRenderMacCocoaImpl::RenderType()
    165 {
    166     return kRenderCocoa;
    167 }
    168 
    169 RawVideoType
    170 VideoRenderMacCocoaImpl::PerferedVideoType()
    171 {
    172     return kVideoI420;
    173 }
    174 
    175 bool
    176 VideoRenderMacCocoaImpl::FullScreen()
    177 {
    178     return false;
    179 }
    180 
    181 int32_t
    182 VideoRenderMacCocoaImpl::GetGraphicsMemory(uint64_t& totalGraphicsMemory,
    183         uint64_t& availableGraphicsMemory) const
    184 {
    185     totalGraphicsMemory = 0;
    186     availableGraphicsMemory = 0;
    187     return 0;
    188 }
    189 
    190 int32_t
    191 VideoRenderMacCocoaImpl::GetScreenResolution(uint32_t& screenWidth,
    192         uint32_t& screenHeight) const
    193 {
    194     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
    195     NSScreen* mainScreen = [NSScreen mainScreen];
    196 
    197     NSRect frame = [mainScreen frame];
    198 
    199     screenWidth = frame.size.width;
    200     screenHeight = frame.size.height;
    201     return 0;
    202 }
    203 
    204 uint32_t
    205 VideoRenderMacCocoaImpl::RenderFrameRate(const uint32_t streamId)
    206 {
    207     CriticalSectionScoped cs(&_renderMacCocoaCritsect);
    208     return 0;
    209 }
    210 
    211 int32_t
    212 VideoRenderMacCocoaImpl::SetStreamCropping(const uint32_t streamId,
    213         const float left,
    214         const float top,
    215         const float right,
    216         const float bottom)
    217 {
    218     return 0;
    219 }
    220 
    221 int32_t VideoRenderMacCocoaImpl::ConfigureRenderer(const uint32_t streamId,
    222                                                    const unsigned int zOrder,
    223                                                    const float left,
    224                                                    const float top,
    225                                                    const float right,
    226                                                    const float bottom)
    227 {
    228     return 0;
    229 }
    230 
    231 int32_t
    232 VideoRenderMacCocoaImpl::SetTransparentBackground(const bool enable)
    233 {
    234     return 0;
    235 }
    236 
    237 int32_t VideoRenderMacCocoaImpl::SetText(const uint8_t textId,
    238                                          const uint8_t* text,
    239                                          const int32_t textLength,
    240                                          const uint32_t textColorRef,
    241                                          const uint32_t backgroundColorRef,
    242                                          const float left,
    243                                          const float top,
    244                                          const float right,
    245                                          const float bottom)
    246 {
    247     return _ptrCocoaRender->SetText(textId, text, textLength, textColorRef, backgroundColorRef, left, top, right, bottom);
    248 }
    249 
    250 int32_t VideoRenderMacCocoaImpl::SetBitmap(const void* bitMap,
    251                                            const uint8_t pictureId,
    252                                            const void* colorKey,
    253                                            const float left,
    254                                            const float top,
    255                                            const float right,
    256                                            const float bottom)
    257 {
    258     return 0;
    259 }
    260 
    261 int32_t VideoRenderMacCocoaImpl::FullScreenRender(void* window, const bool enable)
    262 {
    263     return -1;
    264 }
    265 
    266 }  // namespace webrtc
    267 
    268 #endif // COCOA_RENDERING
    269