| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include "engine_configurations.h" |
| #if defined(CARBON_RENDERING) |
| |
| #include "video_render_mac_carbon_impl.h" |
| #include "critical_section_wrapper.h" |
| #include "video_render_agl.h" |
| #include "trace.h" |
| #include <AGL/agl.h> |
| |
| namespace webrtc { |
| |
| VideoRenderMacCarbonImpl::VideoRenderMacCarbonImpl(const WebRtc_Word32 id, |
| const VideoRenderType videoRenderType, |
| void* window, |
| const bool fullscreen) : |
| _id(id), |
| _renderMacCarbonCritsect(*CriticalSectionWrapper::CreateCriticalSection()), |
| _fullScreen(fullscreen), |
| _ptrWindow(window) |
| { |
| |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "Constructor %s:%d", __FUNCTION__, __LINE__); |
| |
| } |
| |
| VideoRenderMacCarbonImpl::~VideoRenderMacCarbonImpl() |
| { |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "Destructor %s:%d", __FUNCTION__, __LINE__); |
| delete &_renderMacCarbonCritsect; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::Init() |
| { |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d", __FUNCTION__, __LINE__); |
| |
| if (!_ptrWindow) |
| { |
| WEBRTC_TRACE(kTraceWarning, kTraceVideoRenderer, _id, "Constructor %s:%d", __FUNCTION__, __LINE__); |
| return -1; |
| } |
| |
| // We don't know if the user passed us a WindowRef or a HIViewRef, so test. |
| bool referenceIsValid = false; |
| |
| // Check if it's a valid WindowRef |
| //WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s:%d _ptrWindowRef before WindowRef cast: %x", __FUNCTION__, __LINE__, _ptrWindowRef); |
| WindowRef* windowRef = static_cast<WindowRef*>(_ptrWindow); |
| //WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s:%d _ptrWindowRef after cast: %x", __FUNCTION__, __LINE__, _ptrWindowRef); |
| if (IsValidWindowPtr(*windowRef)) |
| { |
| _ptrCarbonRender = new VideoRenderAGL(*windowRef, _fullScreen, _id); |
| referenceIsValid = true; |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Successfully initialized CarbonRenderer with WindowRef:%x", __FUNCTION__, __LINE__, *windowRef); |
| } |
| else |
| { |
| HIViewRef* hiviewRef = static_cast<HIViewRef*>(_ptrWindow); |
| if (HIViewIsValid(*hiviewRef)) |
| { |
| _ptrCarbonRender = new VideoRenderAGL(*hiviewRef, _fullScreen, _id); |
| referenceIsValid = true; |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s:%d Successfully initialized CarbonRenderer with HIViewRef:%x", __FUNCTION__, __LINE__, hiviewRef); |
| } |
| } |
| |
| if(!referenceIsValid) |
| { |
| WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Invalid WindowRef/HIViewRef Returning -1", __FUNCTION__, __LINE__); |
| return -1; |
| } |
| |
| if(!_ptrCarbonRender) |
| { |
| WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Failed to create an instance of VideoRenderAGL. Returning -1", __FUNCTION__, __LINE__); |
| } |
| |
| int retVal = _ptrCarbonRender->Init(); |
| if (retVal == -1) |
| { |
| WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, "%s:%d Failed to init CarbonRenderer", __FUNCTION__, __LINE__); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::ChangeUniqueId(const WebRtc_Word32 id) |
| { |
| return -1; |
| |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s", __FUNCTION__); |
| _id = id; |
| |
| if(_ptrCarbonRender) |
| { |
| _ptrCarbonRender->ChangeUniqueID(_id); |
| } |
| |
| return 0; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::ChangeWindow(void* window) |
| { |
| return -1; |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s changing ID to ", __FUNCTION__, window); |
| |
| if (window == NULL) |
| { |
| return -1; |
| } |
| _ptrWindow = window; |
| |
| WEBRTC_TRACE(kTraceModuleCall, kTraceVideoRenderer, _id, "%s:%d", __FUNCTION__, __LINE__); |
| |
| _ptrWindow = window; |
| |
| return 0; |
| } |
| |
| VideoRenderCallback* |
| VideoRenderMacCarbonImpl::AddIncomingRenderStream(const WebRtc_UWord32 streamId, |
| const WebRtc_UWord32 zOrder, |
| const float left, |
| const float top, |
| const float right, |
| const float bottom) |
| { |
| |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s", __FUNCTION__); |
| VideoChannelAGL* AGLChannel = NULL; |
| |
| if(!_ptrWindow) |
| { |
| WEBRTC_TRACE(kTraceModuleCall, kTraceVideoRenderer, _id, "%s, no window", __FUNCTION__); |
| } |
| |
| if(!AGLChannel) |
| { |
| AGLChannel = _ptrCocoaRender->CreateNSGLChannel(streamId, zOrder, left, top, right, bottom); |
| } |
| |
| return AGLChannel; |
| |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::DeleteIncomingRenderStream(const WebRtc_UWord32 streamId) |
| { |
| |
| WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id, "%s:%d", __FUNCTION__, __LINE__); |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| _ptrCarbonRender->DeleteAGLChannel(streamId); |
| |
| return 0; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::GetIncomingRenderStreamProperties(const WebRtc_UWord32 streamId, |
| WebRtc_UWord32& zOrder, |
| float& left, |
| float& top, |
| float& right, |
| float& bottom) const |
| { |
| return -1; |
| return _ptrCarbonRender->GetChannelProperties(streamId, zOrder, left, top, right, bottom); |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::StartRender() |
| { |
| return _ptrCarbonRender->StartRender(); |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::StopRender() |
| { |
| return _ptrCarbonRender->StopRender(); |
| } |
| |
| VideoRenderType |
| VideoRenderMacCarbonImpl::RenderType() |
| { |
| return kRenderCarbon; |
| } |
| |
| RawVideoType |
| VideoRenderMacCarbonImpl::PerferedVideoType() |
| { |
| return kVideoI420; |
| } |
| |
| bool |
| VideoRenderMacCarbonImpl::FullScreen() |
| { |
| return false; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::GetGraphicsMemory(WebRtc_UWord64& totalGraphicsMemory, |
| WebRtc_UWord64& availableGraphicsMemory) const |
| { |
| totalGraphicsMemory = 0; |
| availableGraphicsMemory = 0; |
| return 0; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::GetScreenResolution(WebRtc_UWord32& screenWidth, |
| WebRtc_UWord32& screenHeight) const |
| { |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| //NSScreen* mainScreen = [NSScreen mainScreen]; |
| |
| //NSRect frame = [mainScreen frame]; |
| |
| //screenWidth = frame.size.width; |
| //screenHeight = frame.size.height; |
| return 0; |
| } |
| |
| WebRtc_UWord32 |
| VideoRenderMacCarbonImpl::RenderFrameRate(const WebRtc_UWord32 streamId) |
| { |
| CriticalSectionScoped cs(_renderMacCarbonCritsect); |
| return 0; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::SetStreamCropping(const WebRtc_UWord32 streamId, |
| const float left, |
| const float top, |
| const float right, |
| const float bottom) |
| { |
| return 0; |
| } |
| |
| WebRtc_Word32 VideoRenderMacCarbonImpl::ConfigureRenderer(const WebRtc_UWord32 streamId, |
| const unsigned int zOrder, |
| const float left, |
| const float top, |
| const float right, |
| const float bottom) |
| { |
| return 0; |
| } |
| |
| WebRtc_Word32 |
| VideoRenderMacCarbonImpl::SetTransparentBackground(const bool enable) |
| { |
| return 0; |
| } |
| |
| WebRtc_Word32 VideoRenderMacCarbonImpl::SetText(const WebRtc_UWord8 textId, |
| const WebRtc_UWord8* text, |
| const WebRtc_Word32 textLength, |
| const WebRtc_UWord32 textColorRef, |
| const WebRtc_UWord32 backgroundColorRef, |
| const float left, |
| const float top, |
| const float right, |
| const float bottom) |
| { |
| return 0; |
| } |
| |
| WebRtc_Word32 VideoRenderMacCarbonImpl::SetBitmap(const void* bitMap, |
| const WebRtc_UWord8 pictureId, |
| const void* colorKey, |
| const float left, |
| const float top, |
| const float right, |
| const float bottom) |
| { |
| return 0; |
| } |
| |
| |
| } //namespace webrtc |
| |
| #endif // CARBON_RENDERING |