blob: 763590f23b51fbc36b1b1413cd192c1ee344b771 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
wu@webrtc.org9143f772012-02-08 00:14:25 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000011#include <assert.h>
12
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000013#include "webrtc/engine_configurations.h"
andrew@webrtc.org9841d922012-10-31 05:22:11 +000014#include "webrtc/modules/video_render/i_video_render.h"
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000015#include "webrtc/modules/video_render/include/video_render_defines.h"
16#include "webrtc/modules/video_render/incoming_video_stream.h"
17#include "webrtc/modules/video_render/video_render_impl.h"
18#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
19#include "webrtc/system_wrappers/interface/trace.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +000021#ifdef WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +000022
23#if defined (_WIN32)
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000024#include "webrtc/modules/video_render/windows/video_render_windows_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000025#define STANDARD_RENDERING kRenderWindows
26
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +000027// WEBRTC_IOS should go before WEBRTC_MAC because WEBRTC_MAC
28// gets defined if WEBRTC_IOS is defined
fischman@webrtc.org36cf4d22013-09-12 17:39:53 +000029#elif defined(WEBRTC_IOS)
30#define STANDARD_RENDERING kRenderiOS
31#include "ios/video_render_ios_impl.h"
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +000032#elif defined(WEBRTC_MAC)
niklase@google.com470e71d2011-07-07 08:21:25 +000033#if defined(COCOA_RENDERING)
34#define STANDARD_RENDERING kRenderCocoa
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000035#include "webrtc/modules/video_render/mac/video_render_mac_cocoa_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000036#elif defined(CARBON_RENDERING)
37#define STANDARD_RENDERING kRenderCarbon
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000038#include "webrtc/modules/video_render/mac/video_render_mac_carbon_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000039#endif
40
leozwang@google.com03bc96d2011-07-26 05:03:10 +000041#elif defined(WEBRTC_ANDROID)
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000042#include "webrtc/modules/video_render/android/video_render_android_impl.h"
43#include "webrtc/modules/video_render/android/video_render_android_native_opengl2.h"
44#include "webrtc/modules/video_render/android/video_render_android_surface_view.h"
fischman@webrtc.orgc6d5b502013-07-18 02:02:07 +000045#define STANDARD_RENDERING kRenderAndroid
niklase@google.com470e71d2011-07-07 08:21:25 +000046
47#elif defined(WEBRTC_LINUX)
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000048#include "webrtc/modules/video_render/linux/video_render_linux_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000049#define STANDARD_RENDERING kRenderX11
50
51#else
52//Other platforms
53#endif
54
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +000055#endif // WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +000056
57// For external rendering
pbos@webrtc.org5aa3f1b2013-07-12 08:12:08 +000058#include "webrtc/modules/video_render/external/video_render_external_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000059#ifndef STANDARD_RENDERING
60#define STANDARD_RENDERING kRenderExternal
61#endif // STANDARD_RENDERING
62
63namespace webrtc {
64
65VideoRender*
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +000066VideoRender::CreateVideoRender(const int32_t id,
niklase@google.com470e71d2011-07-07 08:21:25 +000067 void* window,
68 const bool fullscreen,
69 const VideoRenderType videoRenderType/*=kRenderDefault*/)
70{
niklase@google.com470e71d2011-07-07 08:21:25 +000071 VideoRenderType resultVideoRenderType = videoRenderType;
72 if (videoRenderType == kRenderDefault)
73 {
74 resultVideoRenderType = STANDARD_RENDERING;
75 }
76 return new ModuleVideoRenderImpl(id, resultVideoRenderType, window,
77 fullscreen);
78}
79
80void VideoRender::DestroyVideoRender(
81 VideoRender* module)
82{
83 if (module)
84 {
niklase@google.com470e71d2011-07-07 08:21:25 +000085 delete module;
86 }
87}
88
niklase@google.com470e71d2011-07-07 08:21:25 +000089ModuleVideoRenderImpl::ModuleVideoRenderImpl(
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +000090 const int32_t id,
niklase@google.com470e71d2011-07-07 08:21:25 +000091 const VideoRenderType videoRenderType,
92 void* window,
93 const bool fullscreen) :
94 _id(id), _moduleCrit(*CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +000095 _ptrWindow(window), _fullScreen(fullscreen), _ptrRenderer(NULL)
niklase@google.com470e71d2011-07-07 08:21:25 +000096{
97
98 // Create platform specific renderer
99 switch (videoRenderType)
100 {
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +0000101#ifdef WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +0000102
103#if defined(_WIN32)
104 case kRenderWindows:
105 {
106 VideoRenderWindowsImpl* ptrRenderer;
107 ptrRenderer = new VideoRenderWindowsImpl(_id, videoRenderType, window, _fullScreen);
108 if (ptrRenderer)
109 {
110 _ptrRenderer = reinterpret_cast<IVideoRender*>(ptrRenderer);
111 }
112 }
113 break;
114
fischman@webrtc.org36cf4d22013-09-12 17:39:53 +0000115#elif defined(WEBRTC_IOS)
116 case kRenderiOS:
niklase@google.com470e71d2011-07-07 08:21:25 +0000117 {
fischman@webrtc.org36cf4d22013-09-12 17:39:53 +0000118 VideoRenderIosImpl* ptrRenderer = new VideoRenderIosImpl(_id, window, _fullScreen);
niklase@google.com470e71d2011-07-07 08:21:25 +0000119 if(ptrRenderer)
120 {
121 _ptrRenderer = reinterpret_cast<IVideoRender*>(ptrRenderer);
122 }
123 }
124 break;
125
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000126#elif defined(WEBRTC_MAC)
niklase@google.com470e71d2011-07-07 08:21:25 +0000127
128#if defined(COCOA_RENDERING)
129 case kRenderCocoa:
130 {
131 VideoRenderMacCocoaImpl* ptrRenderer = new VideoRenderMacCocoaImpl(_id, videoRenderType, window, _fullScreen);
132 if(ptrRenderer)
133 {
134 _ptrRenderer = reinterpret_cast<IVideoRender*>(ptrRenderer);
135 }
136 }
137
138 break;
139#elif defined(CARBON_RENDERING)
140 case kRenderCarbon:
141 {
142 VideoRenderMacCarbonImpl* ptrRenderer = new VideoRenderMacCarbonImpl(_id, videoRenderType, window, _fullScreen);
143 if(ptrRenderer)
144 {
145 _ptrRenderer = reinterpret_cast<IVideoRender*>(ptrRenderer);
146 }
147 }
148 break;
149#endif
150
leozwang@google.com03bc96d2011-07-26 05:03:10 +0000151#elif defined(WEBRTC_ANDROID)
niklase@google.com470e71d2011-07-07 08:21:25 +0000152 case kRenderAndroid:
153 {
154 if(AndroidNativeOpenGl2Renderer::UseOpenGL2(window))
155 {
156 AndroidNativeOpenGl2Renderer* ptrRenderer = NULL;
157 ptrRenderer = new AndroidNativeOpenGl2Renderer(_id, videoRenderType, window, _fullScreen);
158 if (ptrRenderer)
159 {
160 _ptrRenderer = reinterpret_cast<IVideoRender*> (ptrRenderer);
161 }
162 }
163 else
164 {
165 AndroidSurfaceViewRenderer* ptrRenderer = NULL;
166 ptrRenderer = new AndroidSurfaceViewRenderer(_id, videoRenderType, window, _fullScreen);
167 if (ptrRenderer)
168 {
169 _ptrRenderer = reinterpret_cast<IVideoRender*> (ptrRenderer);
170 }
171 }
172
173 }
174 break;
175#elif defined(WEBRTC_LINUX)
176 case kRenderX11:
177 {
178 VideoRenderLinuxImpl* ptrRenderer = NULL;
179 ptrRenderer = new VideoRenderLinuxImpl(_id, videoRenderType, window, _fullScreen);
180 if ( ptrRenderer )
181 {
182 _ptrRenderer = reinterpret_cast<IVideoRender*> (ptrRenderer);
183 }
184 }
185 break;
186
187#else
188 // Other platforms
189#endif
190
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +0000191#endif // WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +0000192 case kRenderExternal:
193 {
194 VideoRenderExternalImpl* ptrRenderer(NULL);
195 ptrRenderer = new VideoRenderExternalImpl(_id, videoRenderType,
196 window, _fullScreen);
197 if (ptrRenderer)
198 {
199 _ptrRenderer = reinterpret_cast<IVideoRender*> (ptrRenderer);
200 }
201 }
202 break;
203 default:
204 // Error...
205 break;
206 }
207 if (_ptrRenderer)
208 {
209 if (_ptrRenderer->Init() == -1)
210 {
211 }
212 }
213}
214
215ModuleVideoRenderImpl::~ModuleVideoRenderImpl()
216{
217 delete &_moduleCrit;
218
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000219 for (IncomingVideoStreamMap::iterator it = _streamRenderMap.begin();
220 it != _streamRenderMap.end();
221 ++it) {
222 delete it->second;
niklase@google.com470e71d2011-07-07 08:21:25 +0000223 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000224
225 // Delete platform specific renderer
226 if (_ptrRenderer)
227 {
228 VideoRenderType videoRenderType = _ptrRenderer->RenderType();
fischman@webrtc.org36cf4d22013-09-12 17:39:53 +0000229
niklase@google.com470e71d2011-07-07 08:21:25 +0000230 switch (videoRenderType)
231 {
232 case kRenderExternal:
233 {
234 VideoRenderExternalImpl
235 * ptrRenderer =
236 reinterpret_cast<VideoRenderExternalImpl*> (_ptrRenderer);
237 _ptrRenderer = NULL;
238 delete ptrRenderer;
239 }
240 break;
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +0000241#ifdef WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +0000242
243#if defined(_WIN32)
244 case kRenderWindows:
245 {
246 VideoRenderWindowsImpl* ptrRenderer = reinterpret_cast<VideoRenderWindowsImpl*>(_ptrRenderer);
247 _ptrRenderer = NULL;
248 delete ptrRenderer;
249 }
250 break;
fischman@webrtc.org36cf4d22013-09-12 17:39:53 +0000251#elif defined(WEBRTC_IOS)
252 case kRenderiOS:
253 {
254 VideoRenderIosImpl* ptrRenderer = reinterpret_cast<VideoRenderIosImpl*> (_ptrRenderer);
255 _ptrRenderer = NULL;
256 delete ptrRenderer;
257 }
258 break;
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000259#elif defined(WEBRTC_MAC)
niklase@google.com470e71d2011-07-07 08:21:25 +0000260
261#if defined(COCOA_RENDERING)
262 case kRenderCocoa:
263 {
264 VideoRenderMacCocoaImpl* ptrRenderer = reinterpret_cast<VideoRenderMacCocoaImpl*> (_ptrRenderer);
265 _ptrRenderer = NULL;
266 delete ptrRenderer;
267 }
268 break;
269#elif defined(CARBON_RENDERING)
270 case kRenderCarbon:
271 {
272 VideoRenderMacCarbonImpl* ptrRenderer = reinterpret_cast<VideoRenderMacCarbonImpl*> (_ptrRenderer);
273 _ptrRenderer = NULL;
274 delete ptrRenderer;
275 }
276 break;
277#endif
278
leozwang@google.com03bc96d2011-07-26 05:03:10 +0000279#elif defined(WEBRTC_ANDROID)
niklase@google.com470e71d2011-07-07 08:21:25 +0000280 case kRenderAndroid:
281 {
282 VideoRenderAndroid* ptrRenderer = reinterpret_cast<VideoRenderAndroid*> (_ptrRenderer);
283 _ptrRenderer = NULL;
284 delete ptrRenderer;
285 }
286 break;
287
288#elif defined(WEBRTC_LINUX)
289 case kRenderX11:
290 {
291 VideoRenderLinuxImpl* ptrRenderer = reinterpret_cast<VideoRenderLinuxImpl*> (_ptrRenderer);
292 _ptrRenderer = NULL;
293 delete ptrRenderer;
294 }
295 break;
296#else
297 //other platforms
298#endif
299
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +0000300#endif // WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +0000301
302 default:
303 // Error...
304 break;
305 }
306 }
307}
308
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000309int32_t ModuleVideoRenderImpl::ChangeUniqueId(const int32_t id)
niklase@google.com470e71d2011-07-07 08:21:25 +0000310{
niklase@google.com470e71d2011-07-07 08:21:25 +0000311
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000312 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000313
314 _id = id;
315
316 if (_ptrRenderer)
317 {
318 _ptrRenderer->ChangeUniqueId(_id);
319 }
320
321 return 0;
322}
323
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000324int32_t ModuleVideoRenderImpl::TimeUntilNextProcess()
niklase@google.com470e71d2011-07-07 08:21:25 +0000325{
326 // Not used
327 return 50;
328}
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000329int32_t ModuleVideoRenderImpl::Process()
niklase@google.com470e71d2011-07-07 08:21:25 +0000330{
331 // Not used
332 return 0;
333}
334
335void*
336ModuleVideoRenderImpl::Window()
337{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000338 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000339 return _ptrWindow;
340}
341
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000342int32_t ModuleVideoRenderImpl::ChangeWindow(void* window)
niklase@google.com470e71d2011-07-07 08:21:25 +0000343{
344
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000345 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000346
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +0000347#ifdef WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +0000348
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000349#if defined(WEBRTC_IOS) // WEBRTC_IOS must go before WEBRTC_MAC
niklase@google.com470e71d2011-07-07 08:21:25 +0000350 _ptrRenderer = NULL;
351 delete _ptrRenderer;
352
fischman@webrtc.org36cf4d22013-09-12 17:39:53 +0000353 VideoRenderIosImpl* ptrRenderer;
354 ptrRenderer = new VideoRenderIosImpl(_id, window, _fullScreen);
niklase@google.com470e71d2011-07-07 08:21:25 +0000355 if (!ptrRenderer)
356 {
357 return -1;
358 }
359 _ptrRenderer = reinterpret_cast<IVideoRender*>(ptrRenderer);
360 return _ptrRenderer->ChangeWindow(window);
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000361#elif defined(WEBRTC_MAC)
niklase@google.com470e71d2011-07-07 08:21:25 +0000362
363 _ptrRenderer = NULL;
364 delete _ptrRenderer;
365
366#if defined(COCOA_RENDERING)
367 VideoRenderMacCocoaImpl* ptrRenderer;
368 ptrRenderer = new VideoRenderMacCocoaImpl(_id, kRenderCocoa, window, _fullScreen);
369#elif defined(CARBON_RENDERING)
370 VideoRenderMacCarbonImpl* ptrRenderer;
371 ptrRenderer = new VideoRenderMacCarbonImpl(_id, kRenderCarbon, window, _fullScreen);
372#endif
373 if (!ptrRenderer)
374 {
375 return -1;
376 }
377 _ptrRenderer = reinterpret_cast<IVideoRender*>(ptrRenderer);
378 return _ptrRenderer->ChangeWindow(window);
379
380#else
381 if (!_ptrRenderer)
382 {
383 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
384 "%s: No renderer", __FUNCTION__);
385 return -1;
386 }
387 return _ptrRenderer->ChangeWindow(window);
388
389#endif
390
wu@webrtc.orgf3f2f6a2011-10-19 18:42:17 +0000391#else // WEBRTC_INCLUDE_INTERNAL_VIDEO_RENDER
niklase@google.com470e71d2011-07-07 08:21:25 +0000392 return -1;
393#endif
394}
395
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000396int32_t ModuleVideoRenderImpl::Id()
niklase@google.com470e71d2011-07-07 08:21:25 +0000397{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000398 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000399 return _id;
400}
401
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000402uint32_t ModuleVideoRenderImpl::GetIncomingFrameRate(const uint32_t streamId) {
403 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000404
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000405 IncomingVideoStreamMap::iterator it = _streamRenderMap.find(streamId);
406
407 if (it == _streamRenderMap.end()) {
408 // This stream doesn't exist
409 WEBRTC_TRACE(kTraceError,
410 kTraceVideoRenderer,
411 _id,
412 "%s: stream doesn't exist",
413 __FUNCTION__);
414 return 0;
415 }
416 assert(it->second != NULL);
417 return it->second->IncomingRate();
niklase@google.com470e71d2011-07-07 08:21:25 +0000418}
419
420VideoRenderCallback*
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000421ModuleVideoRenderImpl::AddIncomingRenderStream(const uint32_t streamId,
422 const uint32_t zOrder,
niklase@google.com470e71d2011-07-07 08:21:25 +0000423 const float left,
424 const float top,
425 const float right,
426 const float bottom)
427{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000428 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000429
430 if (!_ptrRenderer)
431 {
432 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
433 "%s: No renderer", __FUNCTION__);
434 return NULL;
435 }
436
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000437 if (_streamRenderMap.find(streamId) != _streamRenderMap.end()) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000438 // The stream already exists...
439 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
440 "%s: stream already exists", __FUNCTION__);
441 return NULL;
442 }
443
niklase@google.com470e71d2011-07-07 08:21:25 +0000444 VideoRenderCallback* ptrRenderCallback =
445 _ptrRenderer->AddIncomingRenderStream(streamId, zOrder, left, top,
446 right, bottom);
447 if (ptrRenderCallback == NULL)
448 {
449 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
450 "%s: Can't create incoming stream in renderer",
451 __FUNCTION__);
452 return NULL;
453 }
454
wu@webrtc.org9143f772012-02-08 00:14:25 +0000455 // Create platform independant code
456 IncomingVideoStream* ptrIncomingStream = new IncomingVideoStream(_id,
457 streamId);
458 if (ptrIncomingStream == NULL)
459 {
460 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
461 "%s: Can't create incoming stream", __FUNCTION__);
462 return NULL;
463 }
464
465
niklase@google.com470e71d2011-07-07 08:21:25 +0000466 if (ptrIncomingStream->SetRenderCallback(ptrRenderCallback) == -1)
467 {
468 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
469 "%s: Can't set render callback", __FUNCTION__);
470 delete ptrIncomingStream;
471 _ptrRenderer->DeleteIncomingRenderStream(streamId);
472 return NULL;
473 }
474
475 VideoRenderCallback* moduleCallback =
476 ptrIncomingStream->ModuleCallback();
477
478 // Store the stream
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000479 _streamRenderMap[streamId] = ptrIncomingStream;
niklase@google.com470e71d2011-07-07 08:21:25 +0000480
481 return moduleCallback;
482}
483
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000484int32_t ModuleVideoRenderImpl::DeleteIncomingRenderStream(
485 const uint32_t streamId)
niklase@google.com470e71d2011-07-07 08:21:25 +0000486{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000487 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000488
489 if (!_ptrRenderer)
490 {
491 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
492 "%s: No renderer", __FUNCTION__);
493 return -1;
494 }
495
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000496 IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId);
497 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000498 {
499 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
500 "%s: stream doesn't exist", __FUNCTION__);
501 return -1;
502 }
503
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000504 delete item->second;
505
niklase@google.com470e71d2011-07-07 08:21:25 +0000506 _ptrRenderer->DeleteIncomingRenderStream(streamId);
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000507
508 _streamRenderMap.erase(item);
niklase@google.com470e71d2011-07-07 08:21:25 +0000509
510 return 0;
511}
512
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000513int32_t ModuleVideoRenderImpl::AddExternalRenderCallback(
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000514 const uint32_t streamId,
515 VideoRenderCallback* renderObject) {
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000516 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000517
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000518 IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId);
519
520 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000521 {
522 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
523 "%s: stream doesn't exist", __FUNCTION__);
524 return -1;
525 }
526
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000527 if (item->second == NULL) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000528 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
529 "%s: could not get stream", __FUNCTION__);
wu@webrtc.org9143f772012-02-08 00:14:25 +0000530 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000531 }
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000532 return item->second->SetExternalCallback(renderObject);
niklase@google.com470e71d2011-07-07 08:21:25 +0000533}
534
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000535int32_t ModuleVideoRenderImpl::GetIncomingRenderStreamProperties(
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000536 const uint32_t streamId,
537 uint32_t& zOrder,
538 float& left,
539 float& top,
540 float& right,
541 float& bottom) const {
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000542 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000543
544 if (!_ptrRenderer)
545 {
546 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
547 "%s: No renderer", __FUNCTION__);
548 return -1;
549 }
550
551 return _ptrRenderer->GetIncomingRenderStreamProperties(streamId, zOrder,
552 left, top, right,
553 bottom);
554}
555
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000556uint32_t ModuleVideoRenderImpl::GetNumIncomingRenderStreams() const
niklase@google.com470e71d2011-07-07 08:21:25 +0000557{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000558 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000559
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000560 return static_cast<uint32_t>(_streamRenderMap.size());
niklase@google.com470e71d2011-07-07 08:21:25 +0000561}
562
563bool ModuleVideoRenderImpl::HasIncomingRenderStream(
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000564 const uint32_t streamId) const {
565 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000566
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000567 return _streamRenderMap.find(streamId) != _streamRenderMap.end();
niklase@google.com470e71d2011-07-07 08:21:25 +0000568}
569
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000570int32_t ModuleVideoRenderImpl::RegisterRawFrameCallback(
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000571 const uint32_t streamId,
572 VideoRenderCallback* callbackObj) {
573 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000574}
575
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000576int32_t ModuleVideoRenderImpl::StartRender(const uint32_t streamId)
niklase@google.com470e71d2011-07-07 08:21:25 +0000577{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000578 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000579
580 if (!_ptrRenderer)
581 {
582 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
583 "%s: No renderer", __FUNCTION__);
584 return -1;
585 }
586
587 // Start the stream
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000588 IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId);
589
590 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000591 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000592 return -1;
593 }
594
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000595 if (item->second->Start() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000596 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000597 return -1;
598 }
599
600 // Start the HW renderer
601 if (_ptrRenderer->StartRender() == -1)
602 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000603 return -1;
604 }
605 return 0;
606}
607
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000608int32_t ModuleVideoRenderImpl::StopRender(const uint32_t streamId)
niklase@google.com470e71d2011-07-07 08:21:25 +0000609{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000610 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000611
612 if (!_ptrRenderer)
613 {
614 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
615 "%s(%d): No renderer", __FUNCTION__, streamId);
616 return -1;
617 }
618
619 // Stop the incoming stream
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000620 IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId);
621
622 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000623 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000624 return -1;
625 }
626
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000627 if (item->second->Stop() == -1)
niklase@google.com470e71d2011-07-07 08:21:25 +0000628 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000629 return -1;
630 }
631
632 return 0;
633}
634
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000635int32_t ModuleVideoRenderImpl::ResetRender()
niklase@google.com470e71d2011-07-07 08:21:25 +0000636{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000637 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000638
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000639 int32_t ret = 0;
640 // Loop through all incoming streams and reset them
641 for (IncomingVideoStreamMap::iterator it = _streamRenderMap.begin();
642 it != _streamRenderMap.end();
643 ++it) {
644 if (it->second->Reset() == -1)
645 ret = -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000646 }
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000647 return ret;
niklase@google.com470e71d2011-07-07 08:21:25 +0000648}
649
650RawVideoType ModuleVideoRenderImpl::PreferredVideoType() const
651{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000652 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000653
654 if (_ptrRenderer == NULL)
655 {
656 return kVideoI420;
657 }
658
659 return _ptrRenderer->PerferedVideoType();
660}
661
662bool ModuleVideoRenderImpl::IsFullScreen()
663{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000664 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000665
666 if (!_ptrRenderer)
667 {
668 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
669 "%s: No renderer", __FUNCTION__);
670 return false;
671 }
672 return _ptrRenderer->FullScreen();
673}
674
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000675int32_t ModuleVideoRenderImpl::GetScreenResolution(
676 uint32_t& screenWidth,
677 uint32_t& screenHeight) const
niklase@google.com470e71d2011-07-07 08:21:25 +0000678{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000679 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000680
681 if (!_ptrRenderer)
682 {
683 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
684 "%s: No renderer", __FUNCTION__);
685 return false;
686 }
687 return _ptrRenderer->GetScreenResolution(screenWidth, screenHeight);
688}
689
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000690uint32_t ModuleVideoRenderImpl::RenderFrameRate(
691 const uint32_t streamId)
niklase@google.com470e71d2011-07-07 08:21:25 +0000692{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000693 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000694
695 if (!_ptrRenderer)
696 {
697 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
698 "%s: No renderer", __FUNCTION__);
699 return false;
700 }
701 return _ptrRenderer->RenderFrameRate(streamId);
702}
703
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000704int32_t ModuleVideoRenderImpl::SetStreamCropping(
705 const uint32_t streamId,
niklase@google.com470e71d2011-07-07 08:21:25 +0000706 const float left,
707 const float top,
708 const float right,
709 const float bottom)
710{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000711 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000712
713 if (!_ptrRenderer)
714 {
715 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
716 "%s: No renderer", __FUNCTION__);
717 return false;
718 }
719 return _ptrRenderer->SetStreamCropping(streamId, left, top, right, bottom);
720}
721
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000722int32_t ModuleVideoRenderImpl::SetTransparentBackground(const bool enable)
niklase@google.com470e71d2011-07-07 08:21:25 +0000723{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000724 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000725
726 if (!_ptrRenderer)
727 {
728 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
729 "%s: No renderer", __FUNCTION__);
730 return false;
731 }
732 return _ptrRenderer->SetTransparentBackground(enable);
733}
734
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000735int32_t ModuleVideoRenderImpl::FullScreenRender(void* window, const bool enable)
niklase@google.com470e71d2011-07-07 08:21:25 +0000736{
737 return -1;
738}
739
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000740int32_t ModuleVideoRenderImpl::SetText(
741 const uint8_t textId,
742 const uint8_t* text,
743 const int32_t textLength,
744 const uint32_t textColorRef,
745 const uint32_t backgroundColorRef,
niklase@google.com470e71d2011-07-07 08:21:25 +0000746 const float left, const float top,
747 const float right,
748 const float bottom)
749{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000750 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000751
752 if (!_ptrRenderer)
753 {
754 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
755 "%s: No renderer", __FUNCTION__);
756 return -1;
757 }
758 return _ptrRenderer->SetText(textId, text, textLength, textColorRef,
759 backgroundColorRef, left, top, right, bottom);
760}
761
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000762int32_t ModuleVideoRenderImpl::SetBitmap(const void* bitMap,
763 const uint8_t pictureId,
764 const void* colorKey,
765 const float left,
766 const float top,
767 const float right,
768 const float bottom)
niklase@google.com470e71d2011-07-07 08:21:25 +0000769{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000770 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000771
772 if (!_ptrRenderer)
773 {
774 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
775 "%s: No renderer", __FUNCTION__);
776 return -1;
777 }
778 return _ptrRenderer->SetBitmap(bitMap, pictureId, colorKey, left, top,
779 right, bottom);
780}
781
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000782int32_t ModuleVideoRenderImpl::GetLastRenderedFrame(
783 const uint32_t streamId,
mikhal@webrtc.org9fedff72012-10-24 18:33:04 +0000784 I420VideoFrame &frame) const
niklase@google.com470e71d2011-07-07 08:21:25 +0000785{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000786 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000787
788 if (!_ptrRenderer)
789 {
790 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
791 "%s: No renderer", __FUNCTION__);
792 return -1;
793 }
794
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000795 IncomingVideoStreamMap::const_iterator item =
796 _streamRenderMap.find(streamId);
797 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000798 {
799 // This stream doesn't exist
800 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
801 "%s: stream doesn't exist", __FUNCTION__);
802 return 0;
803 }
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000804
805 assert(item->second != NULL);
806 return item->second->GetLastRenderedFrame(frame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000807}
808
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000809int32_t ModuleVideoRenderImpl::SetExpectedRenderDelay(
810 uint32_t stream_id, int32_t delay_ms) {
mflodman@webrtc.orgaeb37d32012-10-11 16:31:00 +0000811 CriticalSectionScoped cs(&_moduleCrit);
mflodman@webrtc.orgf4f21452012-09-28 11:27:35 +0000812
813 if (!_ptrRenderer) {
814 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
815 "%s: No renderer", __FUNCTION__);
816 return false;
817 }
818
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000819 IncomingVideoStreamMap::const_iterator item =
820 _streamRenderMap.find(stream_id);
821 if (item == _streamRenderMap.end()) {
mflodman@webrtc.orgf4f21452012-09-28 11:27:35 +0000822 // This stream doesn't exist
823 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
824 "%s(%u, %d): stream doesn't exist", __FUNCTION__, stream_id,
825 delay_ms);
826 return -1;
827 }
828
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000829 assert(item->second != NULL);
830 return item->second->SetExpectedRenderDelay(delay_ms);
mflodman@webrtc.orgf4f21452012-09-28 11:27:35 +0000831}
832
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000833int32_t ModuleVideoRenderImpl::ConfigureRenderer(
834 const uint32_t streamId,
niklase@google.com470e71d2011-07-07 08:21:25 +0000835 const unsigned int zOrder,
836 const float left,
837 const float top,
838 const float right,
839 const float bottom)
840{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000841 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000842
843 if (!_ptrRenderer)
844 {
845 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
846 "%s: No renderer", __FUNCTION__);
847 return false;
848 }
849 return _ptrRenderer->ConfigureRenderer(streamId, zOrder, left, top, right,
850 bottom);
851}
852
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000853int32_t ModuleVideoRenderImpl::SetStartImage(
854 const uint32_t streamId,
mikhal@webrtc.org9fedff72012-10-24 18:33:04 +0000855 const I420VideoFrame& videoFrame)
niklase@google.com470e71d2011-07-07 08:21:25 +0000856{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000857 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000858
859 if (!_ptrRenderer)
860 {
861 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
862 "%s: No renderer", __FUNCTION__);
863 return -1;
864 }
865
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000866 IncomingVideoStreamMap::const_iterator item =
867 _streamRenderMap.find(streamId);
868 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000869 {
870 // This stream doesn't exist
871 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
872 "%s: stream doesn't exist", __FUNCTION__);
873 return -1;
874 }
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000875 assert (item->second != NULL);
876 return item->second->SetStartImage(videoFrame);
niklase@google.com470e71d2011-07-07 08:21:25 +0000877
878}
879
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000880int32_t ModuleVideoRenderImpl::SetTimeoutImage(
881 const uint32_t streamId,
mikhal@webrtc.org9fedff72012-10-24 18:33:04 +0000882 const I420VideoFrame& videoFrame,
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000883 const uint32_t timeout)
niklase@google.com470e71d2011-07-07 08:21:25 +0000884{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000885 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000886
887 if (!_ptrRenderer)
888 {
889 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
890 "%s: No renderer", __FUNCTION__);
891 return -1;
892 }
893
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000894 IncomingVideoStreamMap::const_iterator item =
895 _streamRenderMap.find(streamId);
896 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000897 {
898 // This stream doesn't exist
899 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
900 "%s: stream doesn't exist", __FUNCTION__);
901 return -1;
902 }
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000903 assert(item->second != NULL);
904 return item->second->SetTimeoutImage(videoFrame, timeout);
niklase@google.com470e71d2011-07-07 08:21:25 +0000905}
906
pbos@webrtc.orgddf94e72013-04-10 08:09:04 +0000907int32_t ModuleVideoRenderImpl::MirrorRenderStream(const int renderId,
908 const bool enable,
909 const bool mirrorXAxis,
910 const bool mirrorYAxis)
niklase@google.com470e71d2011-07-07 08:21:25 +0000911{
mflodman@webrtc.org0e703f42012-03-06 12:02:20 +0000912 CriticalSectionScoped cs(&_moduleCrit);
niklase@google.com470e71d2011-07-07 08:21:25 +0000913
914 if (!_ptrRenderer)
915 {
916 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
917 "%s: No renderer", __FUNCTION__);
918 return -1;
919 }
920
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000921 IncomingVideoStreamMap::const_iterator item =
922 _streamRenderMap.find(renderId);
923 if (item == _streamRenderMap.end())
niklase@google.com470e71d2011-07-07 08:21:25 +0000924 {
925 // This stream doesn't exist
926 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
927 "%s: stream doesn't exist", __FUNCTION__);
928 return 0;
929 }
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000930 assert(item->second != NULL);
niklase@google.com470e71d2011-07-07 08:21:25 +0000931
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000932 return item->second->EnableMirroring(enable, mirrorXAxis, mirrorYAxis);
niklase@google.com470e71d2011-07-07 08:21:25 +0000933}
934
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000935} // namespace webrtc