Index: webrtc/modules/video_render/windows/video_render_windows_impl.cc |
diff --git a/webrtc/modules/video_render/windows/video_render_windows_impl.cc b/webrtc/modules/video_render/windows/video_render_windows_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..042d7fdfa335f54a6f0bac3d931573479b1272cb |
--- /dev/null |
+++ b/webrtc/modules/video_render/windows/video_render_windows_impl.cc |
@@ -0,0 +1,337 @@ |
+/* |
+ * 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 <tchar.h> |
+ |
+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<IVideoRenderWin*>(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 |