/* * Copyright (c) 2012 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 "webrtc/engine_configurations.h" #include "webrtc/modules/video_render/windows/video_render_windows_impl.h" #include "webrtc/system_wrappers/include/critical_section_wrapper.h" #include "webrtc/system_wrappers/include/trace.h" #ifdef DIRECT3D9_RENDERING #include "webrtc/modules/video_render/windows/video_render_direct3d9.h" #endif #include namespace webrtc { VideoRenderWindowsImpl::VideoRenderWindowsImpl(const int32_t id, const VideoRenderType videoRenderType, void* window, const bool fullscreen) : _renderWindowsCritsect(*CriticalSectionWrapper::CreateCriticalSection()), _prtWindow(window), _fullscreen(fullscreen), _renderMethod(kVideoRenderWinD3D9), _ptrRendererWin(NULL) { } VideoRenderWindowsImpl::~VideoRenderWindowsImpl() { delete &_renderWindowsCritsect; if (_ptrRendererWin) { delete _ptrRendererWin; _ptrRendererWin = NULL; } } int32_t VideoRenderWindowsImpl::Init() { // Create the win renderer switch (_renderMethod) { case kVideoRenderWinD3D9: { #ifdef DIRECT3D9_RENDERING VideoRenderDirect3D9* ptrRenderer; ptrRenderer = new VideoRenderDirect3D9(NULL, (HWND) _prtWindow, _fullscreen); if (ptrRenderer == NULL) { break; } _ptrRendererWin = reinterpret_cast(ptrRenderer); #else return NULL; #endif //DIRECT3D9_RENDERING } break; default: break; } //Init renderer if (_ptrRendererWin) return _ptrRendererWin->Init(); else return -1; } int32_t VideoRenderWindowsImpl::ChangeWindow(void* window) { CriticalSectionScoped cs(&_renderWindowsCritsect); if (!_ptrRendererWin) { return -1; } else { return _ptrRendererWin->ChangeWindow(window); } } VideoRenderCallback* VideoRenderWindowsImpl::AddIncomingRenderStream(const uint32_t streamId, const uint32_t zOrder, const float left, const float top, const float right, const float bottom) { CriticalSectionScoped cs(&_renderWindowsCritsect); VideoRenderCallback* renderCallback = NULL; if (!_ptrRendererWin) { } else { renderCallback = _ptrRendererWin->CreateChannel(streamId, zOrder, left, top, right, bottom); } return renderCallback; } int32_t VideoRenderWindowsImpl::DeleteIncomingRenderStream( const uint32_t streamId) { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->DeleteChannel(streamId); } return error; } int32_t VideoRenderWindowsImpl::GetIncomingRenderStreamProperties( const uint32_t streamId, uint32_t& zOrder, float& left, float& top, float& right, float& bottom) const { CriticalSectionScoped cs(&_renderWindowsCritsect); zOrder = 0; left = 0; top = 0; right = 0; bottom = 0; int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->GetStreamSettings(streamId, 0, zOrder, left, top, right, bottom); } return error; } int32_t VideoRenderWindowsImpl::StartRender() { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->StartRender(); } return error; } int32_t VideoRenderWindowsImpl::StopRender() { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->StopRender(); } return error; } VideoRenderType VideoRenderWindowsImpl::RenderType() { return kRenderWindows; } RawVideoType VideoRenderWindowsImpl::PerferedVideoType() { return kVideoI420; } bool VideoRenderWindowsImpl::FullScreen() { CriticalSectionScoped cs(&_renderWindowsCritsect); bool fullscreen = false; if (!_ptrRendererWin) { } else { fullscreen = _ptrRendererWin->IsFullScreen(); } return fullscreen; } int32_t VideoRenderWindowsImpl::GetGraphicsMemory( uint64_t& totalGraphicsMemory, uint64_t& availableGraphicsMemory) const { if (_ptrRendererWin) { return _ptrRendererWin->GetGraphicsMemory(totalGraphicsMemory, availableGraphicsMemory); } totalGraphicsMemory = 0; availableGraphicsMemory = 0; return -1; } int32_t VideoRenderWindowsImpl::GetScreenResolution( uint32_t& screenWidth, uint32_t& screenHeight) const { CriticalSectionScoped cs(&_renderWindowsCritsect); screenWidth = 0; screenHeight = 0; return 0; } uint32_t VideoRenderWindowsImpl::RenderFrameRate( const uint32_t streamId) { CriticalSectionScoped cs(&_renderWindowsCritsect); return 0; } int32_t VideoRenderWindowsImpl::SetStreamCropping( const uint32_t streamId, const float left, const float top, const float right, const float bottom) { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->SetCropping(streamId, 0, left, top, right, bottom); } return error; } int32_t VideoRenderWindowsImpl::ConfigureRenderer( const uint32_t streamId, const unsigned int zOrder, const float left, const float top, const float right, const float bottom) { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->ConfigureRenderer(streamId, 0, zOrder, left, top, right, bottom); } return error; } int32_t VideoRenderWindowsImpl::SetTransparentBackground( const bool enable) { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->SetTransparentBackground(enable); } return error; } int32_t VideoRenderWindowsImpl::SetText( const uint8_t textId, const uint8_t* text, const int32_t textLength, const uint32_t textColorRef, const uint32_t backgroundColorRef, const float left, const float top, const float right, const float bottom) { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->SetText(textId, text, textLength, textColorRef, backgroundColorRef, left, top, right, bottom); } return error; } int32_t VideoRenderWindowsImpl::SetBitmap(const void* bitMap, const uint8_t pictureId, const void* colorKey, const float left, const float top, const float right, const float bottom) { CriticalSectionScoped cs(&_renderWindowsCritsect); int32_t error = -1; if (!_ptrRendererWin) { } else { error = _ptrRendererWin->SetBitmap(bitMap, pictureId, colorKey, left, top, right, bottom); } return error; } } // namespace webrtc