1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <assert.h> 123f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org 137e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/engine_configurations.h" 140ab271b4001169347867b4eeac3035e3442026f9andresp@webrtc.org#include "webrtc/modules/video_render/external/video_render_external_impl.h" 157e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/include/video_render_defines.h" 167e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/incoming_video_stream.h" 170ab271b4001169347867b4eeac3035e3442026f9andresp@webrtc.org#include "webrtc/modules/video_render/i_video_render.h" 187e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/modules/video_render/video_render_impl.h" 197e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 207e5dc8741fbd5f07a709e6fd4d2cd8b08b7cee94pbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h" 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoRender* 25e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgVideoRender::CreateVideoRender(const int32_t id, 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void* window, 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool fullscreen, 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const VideoRenderType videoRenderType/*=kRenderDefault*/) 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderType resultVideoRenderType = videoRenderType; 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (videoRenderType == kRenderDefault) 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 330ab271b4001169347867b4eeac3035e3442026f9andresp@webrtc.org resultVideoRenderType = kRenderExternal; 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return new ModuleVideoRenderImpl(id, resultVideoRenderType, window, 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fullscreen); 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VideoRender::DestroyVideoRender( 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRender* module) 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (module) 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete module; 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgModuleVideoRenderImpl::ModuleVideoRenderImpl( 49e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const int32_t id, 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const VideoRenderType videoRenderType, 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void* window, 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const bool fullscreen) : 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _id(id), _moduleCrit(*CriticalSectionWrapper::CreateCriticalSection()), 5452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _ptrWindow(window), _fullScreen(fullscreen), _ptrRenderer(NULL) 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create platform specific renderer 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch (videoRenderType) 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kRenderExternal: 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderExternalImpl* ptrRenderer(NULL); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrRenderer = new VideoRenderExternalImpl(_id, videoRenderType, 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org window, _fullScreen); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrRenderer) 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _ptrRenderer = reinterpret_cast<IVideoRender*> (ptrRenderer); 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org default: 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Error... 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_ptrRenderer) 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_ptrRenderer->Init() == -1) 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgModuleVideoRenderImpl::~ModuleVideoRenderImpl() 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete &_moduleCrit; 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 8752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org for (IncomingVideoStreamMap::iterator it = _streamRenderMap.begin(); 8852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org it != _streamRenderMap.end(); 8952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org ++it) { 9052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org delete it->second; 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Delete platform specific renderer 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_ptrRenderer) 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderType videoRenderType = _ptrRenderer->RenderType(); 97bc375b56d1d38a5b99d5cc726e1da098b5da969dfischman@webrtc.org 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch (videoRenderType) 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kRenderExternal: 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderExternalImpl 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * ptrRenderer = 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org reinterpret_cast<VideoRenderExternalImpl*> (_ptrRenderer); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _ptrRenderer = NULL; 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete ptrRenderer; 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org default: 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Error... 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 117e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::ChangeUniqueId(const int32_t id) 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _id = id; 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_ptrRenderer) 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _ptrRenderer->ChangeUniqueId(_id); 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 132e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::TimeUntilNextProcess() 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Not used 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 50; 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 137e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::Process() 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Not used 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid* 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgModuleVideoRenderImpl::Window() 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrWindow; 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 150e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::ChangeWindow(void* window) 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 155e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::Id() 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _id; 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.orguint32_t ModuleVideoRenderImpl::GetIncomingFrameRate(const uint32_t streamId) { 16252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::iterator it = _streamRenderMap.find(streamId); 16552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 16652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (it == _streamRenderMap.end()) { 16752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org // This stream doesn't exist 16852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org WEBRTC_TRACE(kTraceError, 16952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org kTraceVideoRenderer, 17052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _id, 17152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org "%s: stream doesn't exist", 17252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org __FUNCTION__); 17352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return 0; 17452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org } 17552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org assert(it->second != NULL); 17652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return it->second->IncomingRate(); 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoRenderCallback* 180e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgModuleVideoRenderImpl::AddIncomingRenderStream(const uint32_t streamId, 181e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t zOrder, 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float top, 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom) 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (_streamRenderMap.find(streamId) != _streamRenderMap.end()) { 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // The stream already exists... 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream already exists", __FUNCTION__); 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderCallback* ptrRenderCallback = 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _ptrRenderer->AddIncomingRenderStream(streamId, zOrder, left, top, 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org right, bottom); 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrRenderCallback == NULL) 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: Can't create incoming stream in renderer", 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org __FUNCTION__); 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create platform independant code 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org IncomingVideoStream* ptrIncomingStream = new IncomingVideoStream(_id, 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org streamId); 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrIncomingStream == NULL) 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: Can't create incoming stream", __FUNCTION__); 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrIncomingStream->SetRenderCallback(ptrRenderCallback) == -1) 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: Can't set render callback", __FUNCTION__); 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delete ptrIncomingStream; 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _ptrRenderer->DeleteIncomingRenderStream(streamId); 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return NULL; 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoRenderCallback* moduleCallback = 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrIncomingStream->ModuleCallback(); 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Store the stream 23852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap[streamId] = ptrIncomingStream; 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return moduleCallback; 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 243e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::DeleteIncomingRenderStream( 244e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId) 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId); 25652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream doesn't exist", __FUNCTION__); 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org delete item->second; 26452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _ptrRenderer->DeleteIncomingRenderStream(streamId); 26652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 26752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap.erase(item); 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 272e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::AddExternalRenderCallback( 27352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org const uint32_t streamId, 27452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org VideoRenderCallback* renderObject) { 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId); 27852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 27952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream doesn't exist", __FUNCTION__); 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 28652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item->second == NULL) { 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: could not get stream", __FUNCTION__); 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 29152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return item->second->SetExternalCallback(renderObject); 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 294e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::GetIncomingRenderStreamProperties( 29552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org const uint32_t streamId, 29652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org uint32_t& zOrder, 29752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org float& left, 29852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org float& top, 29952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org float& right, 30052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org float& bottom) const { 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->GetIncomingRenderStreamProperties(streamId, zOrder, 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org left, top, right, 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bottom); 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 315e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orguint32_t ModuleVideoRenderImpl::GetNumIncomingRenderStreams() const 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 31952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return static_cast<uint32_t>(_streamRenderMap.size()); 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool ModuleVideoRenderImpl::HasIncomingRenderStream( 32352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org const uint32_t streamId) const { 32452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return _streamRenderMap.find(streamId) != _streamRenderMap.end(); 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 329e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::RegisterRawFrameCallback( 33052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org const uint32_t streamId, 33152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org VideoRenderCallback* callbackObj) { 33252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return -1; 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 335e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::StartRender(const uint32_t streamId) 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Start the stream 34752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId); 34852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 34952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 35452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item->second->Start() == -1) 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Start the HW renderer 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_ptrRenderer->StartRender() == -1) 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 367e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::StopRender(const uint32_t streamId) 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s(%d): No renderer", __FUNCTION__, streamId); 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Stop the incoming stream 37952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::iterator item = _streamRenderMap.find(streamId); 38052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 38152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item->second->Stop() == -1) 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 394e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::ResetRender() 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org int32_t ret = 0; 39952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org // Loop through all incoming streams and reset them 40052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org for (IncomingVideoStreamMap::iterator it = _streamRenderMap.begin(); 40152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org it != _streamRenderMap.end(); 40252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org ++it) { 40352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (it->second->Reset() == -1) 40452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org ret = -1; 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 40652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return ret; 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgRawVideoType ModuleVideoRenderImpl::PreferredVideoType() const 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_ptrRenderer == NULL) 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kVideoI420; 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->PerferedVideoType(); 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool ModuleVideoRenderImpl::IsFullScreen() 422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->FullScreen(); 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 434e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::GetScreenResolution( 435e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t& screenWidth, 436e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t& screenHeight) const 437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->GetScreenResolution(screenWidth, screenHeight); 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 449e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orguint32_t ModuleVideoRenderImpl::RenderFrameRate( 450e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId) 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->RenderFrameRate(streamId); 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 463e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetStreamCropping( 464e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float top, 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom) 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->SetStreamCropping(streamId, left, top, right, bottom); 479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 481e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetTransparentBackground(const bool enable) 482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->SetTransparentBackground(enable); 492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 494e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::FullScreenRender(void* window, const bool enable) 495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 499e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetText( 500e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint8_t textId, 501e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint8_t* text, 502e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const int32_t textLength, 503e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t textColorRef, 504e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t backgroundColorRef, 505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, const float top, 506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom) 508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->SetText(textId, text, textLength, textColorRef, 518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org backgroundColorRef, left, top, right, bottom); 519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 521e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetBitmap(const void* bitMap, 522e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint8_t pictureId, 523e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const void* colorKey, 524e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float left, 525e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float top, 526e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float right, 527e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const float bottom) 528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->SetBitmap(bitMap, pictureId, colorKey, left, top, 538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org right, bottom); 539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 541e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::GetLastRenderedFrame( 542e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 5433bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org I420VideoFrame &frame) const 544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 55452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::const_iterator item = 55552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap.find(streamId); 55652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This stream doesn't exist 559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream doesn't exist", __FUNCTION__); 561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 56352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org 56452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org assert(item->second != NULL); 56552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return item->second->GetLastRenderedFrame(frame); 566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 568e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetExpectedRenderDelay( 569e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org uint32_t stream_id, int32_t delay_ms) { 570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) { 573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 57852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::const_iterator item = 57952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap.find(stream_id); 58052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) { 581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This stream doesn't exist 582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s(%u, %d): stream doesn't exist", __FUNCTION__, stream_id, 584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org delay_ms); 585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58852c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org assert(item->second != NULL); 58952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return item->second->SetExpectedRenderDelay(delay_ms); 590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 592e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::ConfigureRenderer( 593e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const unsigned int zOrder, 595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float left, 596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float top, 597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float right, 598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const float bottom) 599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _ptrRenderer->ConfigureRenderer(streamId, zOrder, left, top, right, 609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bottom); 610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 612e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetStartImage( 613e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 6143bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org const I420VideoFrame& videoFrame) 615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 62552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::const_iterator item = 62652c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap.find(streamId); 62752c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This stream doesn't exist 630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream doesn't exist", __FUNCTION__); 632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 63452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org assert (item->second != NULL); 63552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return item->second->SetStartImage(videoFrame); 636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 639e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::SetTimeoutImage( 640e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t streamId, 6413bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org const I420VideoFrame& videoFrame, 642e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const uint32_t timeout) 643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::const_iterator item = 65452c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap.find(streamId); 65552c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This stream doesn't exist 658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream doesn't exist", __FUNCTION__); 660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 66252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org assert(item->second != NULL); 66352c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return item->second->SetTimeoutImage(videoFrame, timeout); 664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 666e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.orgint32_t ModuleVideoRenderImpl::MirrorRenderStream(const int renderId, 667e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const bool enable, 668e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const bool mirrorXAxis, 669e1ca446434022ad0d05ebd5ed2feafb08ae940e3pbos@webrtc.org const bool mirrorYAxis) 670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionScoped cs(&_moduleCrit); 672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!_ptrRenderer) 674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: No renderer", __FUNCTION__); 677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 68052c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org IncomingVideoStreamMap::const_iterator item = 68152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org _streamRenderMap.find(renderId); 68252c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org if (item == _streamRenderMap.end()) 683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // This stream doesn't exist 685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id, 686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "%s: stream doesn't exist", __FUNCTION__); 687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 68952c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org assert(item->second != NULL); 690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 69152c5c708de6f5bcf9c2a58cece45013aa5efacd7pbos@webrtc.org return item->second->EnableMirroring(enable, mirrorXAxis, mirrorYAxis); 692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 6943b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 695