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 #include "webrtc/modules/video_render/windows/video_render_windows_impl.h"
13
14 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
15 #include "webrtc/system_wrappers/include/trace.h"
16 #ifdef DIRECT3D9_RENDERING
17 #include "webrtc/modules/video_render/windows/video_render_direct3d9.h"
18 #endif
19
20 #include <tchar.h>
21
22 namespace webrtc {
23
VideoRenderWindowsImpl(const int32_t id,const VideoRenderType videoRenderType,void * window,const bool fullscreen)24 VideoRenderWindowsImpl::VideoRenderWindowsImpl(const int32_t id,
25 const VideoRenderType videoRenderType, void* window, const bool fullscreen)
26 : _renderWindowsCritsect(*CriticalSectionWrapper::CreateCriticalSection()),
27 _prtWindow(window),
28 _fullscreen(fullscreen),
29 _renderMethod(kVideoRenderWinD3D9),
30 _ptrRendererWin(NULL) {
31 }
32
~VideoRenderWindowsImpl()33 VideoRenderWindowsImpl::~VideoRenderWindowsImpl()
34 {
35 delete &_renderWindowsCritsect;
36 if (_ptrRendererWin)
37 {
38 delete _ptrRendererWin;
39 _ptrRendererWin = NULL;
40 }
41 }
42
Init()43 int32_t VideoRenderWindowsImpl::Init()
44 {
45 // Create the win renderer
46 switch (_renderMethod)
47 {
48 case kVideoRenderWinD3D9:
49 {
50 #ifdef DIRECT3D9_RENDERING
51 VideoRenderDirect3D9* ptrRenderer;
52 ptrRenderer = new VideoRenderDirect3D9(NULL, (HWND) _prtWindow, _fullscreen);
53 if (ptrRenderer == NULL)
54 {
55 break;
56 }
57 _ptrRendererWin = reinterpret_cast<IVideoRenderWin*>(ptrRenderer);
58 #else
59 return NULL;
60 #endif //DIRECT3D9_RENDERING
61 }
62 break;
63 default:
64 break;
65 }
66
67 //Init renderer
68 if (_ptrRendererWin)
69 return _ptrRendererWin->Init();
70 else
71 return -1;
72 }
73
ChangeWindow(void * window)74 int32_t VideoRenderWindowsImpl::ChangeWindow(void* window)
75 {
76 CriticalSectionScoped cs(&_renderWindowsCritsect);
77 if (!_ptrRendererWin)
78 {
79 return -1;
80 }
81 else
82 {
83 return _ptrRendererWin->ChangeWindow(window);
84 }
85 }
86
87 VideoRenderCallback*
AddIncomingRenderStream(const uint32_t streamId,const uint32_t zOrder,const float left,const float top,const float right,const float bottom)88 VideoRenderWindowsImpl::AddIncomingRenderStream(const uint32_t streamId,
89 const uint32_t zOrder,
90 const float left,
91 const float top,
92 const float right,
93 const float bottom)
94 {
95 CriticalSectionScoped cs(&_renderWindowsCritsect);
96 VideoRenderCallback* renderCallback = NULL;
97
98 if (!_ptrRendererWin)
99 {
100 }
101 else
102 {
103 renderCallback = _ptrRendererWin->CreateChannel(streamId, zOrder, left,
104 top, right, bottom);
105 }
106
107 return renderCallback;
108 }
109
DeleteIncomingRenderStream(const uint32_t streamId)110 int32_t VideoRenderWindowsImpl::DeleteIncomingRenderStream(
111 const uint32_t streamId)
112 {
113 CriticalSectionScoped cs(&_renderWindowsCritsect);
114 int32_t error = -1;
115 if (!_ptrRendererWin)
116 {
117 }
118 else
119 {
120 error = _ptrRendererWin->DeleteChannel(streamId);
121 }
122 return error;
123 }
124
GetIncomingRenderStreamProperties(const uint32_t streamId,uint32_t & zOrder,float & left,float & top,float & right,float & bottom) const125 int32_t VideoRenderWindowsImpl::GetIncomingRenderStreamProperties(
126 const uint32_t streamId,
127 uint32_t& zOrder,
128 float& left,
129 float& top,
130 float& right,
131 float& bottom) const
132 {
133 CriticalSectionScoped cs(&_renderWindowsCritsect);
134 zOrder = 0;
135 left = 0;
136 top = 0;
137 right = 0;
138 bottom = 0;
139
140 int32_t error = -1;
141 if (!_ptrRendererWin)
142 {
143 }
144 else
145 {
146 error = _ptrRendererWin->GetStreamSettings(streamId, 0, zOrder, left,
147 top, right, bottom);
148 }
149 return error;
150 }
151
StartRender()152 int32_t VideoRenderWindowsImpl::StartRender()
153 {
154 CriticalSectionScoped cs(&_renderWindowsCritsect);
155 int32_t error = -1;
156 if (!_ptrRendererWin)
157 {
158 }
159 else
160 {
161 error = _ptrRendererWin->StartRender();
162 }
163 return error;
164 }
165
StopRender()166 int32_t VideoRenderWindowsImpl::StopRender()
167 {
168 CriticalSectionScoped cs(&_renderWindowsCritsect);
169 int32_t error = -1;
170 if (!_ptrRendererWin)
171 {
172 }
173 else
174 {
175 error = _ptrRendererWin->StopRender();
176 }
177 return error;
178 }
179
RenderType()180 VideoRenderType VideoRenderWindowsImpl::RenderType()
181 {
182 return kRenderWindows;
183 }
184
PerferedVideoType()185 RawVideoType VideoRenderWindowsImpl::PerferedVideoType()
186 {
187 return kVideoI420;
188 }
189
FullScreen()190 bool VideoRenderWindowsImpl::FullScreen()
191 {
192 CriticalSectionScoped cs(&_renderWindowsCritsect);
193 bool fullscreen = false;
194 if (!_ptrRendererWin)
195 {
196 }
197 else
198 {
199 fullscreen = _ptrRendererWin->IsFullScreen();
200 }
201 return fullscreen;
202 }
203
GetGraphicsMemory(uint64_t & totalGraphicsMemory,uint64_t & availableGraphicsMemory) const204 int32_t VideoRenderWindowsImpl::GetGraphicsMemory(
205 uint64_t& totalGraphicsMemory,
206 uint64_t& availableGraphicsMemory) const
207 {
208 if (_ptrRendererWin)
209 {
210 return _ptrRendererWin->GetGraphicsMemory(totalGraphicsMemory,
211 availableGraphicsMemory);
212 }
213
214 totalGraphicsMemory = 0;
215 availableGraphicsMemory = 0;
216 return -1;
217 }
218
GetScreenResolution(uint32_t & screenWidth,uint32_t & screenHeight) const219 int32_t VideoRenderWindowsImpl::GetScreenResolution(
220 uint32_t& screenWidth,
221 uint32_t& screenHeight) const
222 {
223 CriticalSectionScoped cs(&_renderWindowsCritsect);
224 screenWidth = 0;
225 screenHeight = 0;
226 return 0;
227 }
228
RenderFrameRate(const uint32_t streamId)229 uint32_t VideoRenderWindowsImpl::RenderFrameRate(
230 const uint32_t streamId)
231 {
232 CriticalSectionScoped cs(&_renderWindowsCritsect);
233 return 0;
234 }
235
SetStreamCropping(const uint32_t streamId,const float left,const float top,const float right,const float bottom)236 int32_t VideoRenderWindowsImpl::SetStreamCropping(
237 const uint32_t streamId,
238 const float left,
239 const float top,
240 const float right,
241 const float bottom)
242 {
243 CriticalSectionScoped cs(&_renderWindowsCritsect);
244 int32_t error = -1;
245 if (!_ptrRendererWin)
246 {
247 }
248 else
249 {
250 error = _ptrRendererWin->SetCropping(streamId, 0, left, top, right,
251 bottom);
252 }
253 return error;
254 }
255
ConfigureRenderer(const uint32_t streamId,const unsigned int zOrder,const float left,const float top,const float right,const float bottom)256 int32_t VideoRenderWindowsImpl::ConfigureRenderer(
257 const uint32_t streamId,
258 const unsigned int zOrder,
259 const float left,
260 const float top,
261 const float right,
262 const float bottom)
263 {
264 CriticalSectionScoped cs(&_renderWindowsCritsect);
265 int32_t error = -1;
266 if (!_ptrRendererWin)
267 {
268 }
269 else
270 {
271 error = _ptrRendererWin->ConfigureRenderer(streamId, 0, zOrder, left,
272 top, right, bottom);
273 }
274
275 return error;
276 }
277
SetTransparentBackground(const bool enable)278 int32_t VideoRenderWindowsImpl::SetTransparentBackground(
279 const bool enable)
280 {
281 CriticalSectionScoped cs(&_renderWindowsCritsect);
282 int32_t error = -1;
283 if (!_ptrRendererWin)
284 {
285 }
286 else
287 {
288 error = _ptrRendererWin->SetTransparentBackground(enable);
289 }
290 return error;
291 }
292
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)293 int32_t VideoRenderWindowsImpl::SetText(
294 const uint8_t textId,
295 const uint8_t* text,
296 const int32_t textLength,
297 const uint32_t textColorRef,
298 const uint32_t backgroundColorRef,
299 const float left,
300 const float top,
301 const float right,
302 const float bottom)
303 {
304 CriticalSectionScoped cs(&_renderWindowsCritsect);
305 int32_t error = -1;
306 if (!_ptrRendererWin)
307 {
308 }
309 else
310 {
311 error = _ptrRendererWin->SetText(textId, text, textLength,
312 textColorRef, backgroundColorRef,
313 left, top, right, bottom);
314 }
315 return error;
316 }
317
SetBitmap(const void * bitMap,const uint8_t pictureId,const void * colorKey,const float left,const float top,const float right,const float bottom)318 int32_t VideoRenderWindowsImpl::SetBitmap(const void* bitMap,
319 const uint8_t pictureId,
320 const void* colorKey,
321 const float left, const float top,
322 const float right, const float bottom)
323 {
324 CriticalSectionScoped cs(&_renderWindowsCritsect);
325 int32_t error = -1;
326 if (!_ptrRendererWin)
327 {
328 }
329 else
330 {
331 error = _ptrRendererWin->SetBitmap(bitMap, pictureId, colorKey, left,
332 top, right, bottom);
333 }
334 return error;
335 }
336
337 } // namespace webrtc
338