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