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