blob: a732ea701c684b8bc6fd0697f5b62fdccfd6700e [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000011#include "video_engine/vie_render_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +000013#include "engine_configurations.h" // NOLINT
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000014#include "modules/video_render/main/interface/video_render.h"
15#include "modules/video_render/main/interface/video_render_defines.h"
16#include "system_wrappers/interface/trace.h"
mflodman@webrtc.orga4863db2011-12-22 08:51:52 +000017#include "video_engine/include/vie_errors.h"
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000018#include "video_engine/vie_capturer.h"
19#include "video_engine/vie_channel.h"
20#include "video_engine/vie_channel_manager.h"
21#include "video_engine/vie_defines.h"
22#include "video_engine/vie_frame_provider_base.h"
23#include "video_engine/vie_impl.h"
24#include "video_engine/vie_input_manager.h"
25#include "video_engine/vie_render_manager.h"
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000026#include "video_engine/vie_renderer.h"
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000027#include "video_engine/vie_shared_data.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000028
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000029namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000030
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000031ViERender* ViERender::GetInterface(VideoEngine* video_engine) {
niklase@google.com470e71d2011-07-07 08:21:25 +000032#ifdef WEBRTC_VIDEO_ENGINE_RENDER_API
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000033 if (!video_engine) {
niklase@google.com470e71d2011-07-07 08:21:25 +000034 return NULL;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000035 }
36 VideoEngineImpl* vie_impl = reinterpret_cast<VideoEngineImpl*>(video_engine);
37 ViERenderImpl* vie_render_impl = vie_impl;
38 // Increase ref count.
39 (*vie_render_impl)++;
40 return vie_render_impl;
41#else
42 return NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +000043#endif
44}
45
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000046int ViERenderImpl::Release() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000047 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000048 "ViERender::Release()");
49 // Decrease ref count
50 (*this)--;
51 WebRtc_Word32 ref_count = GetCount();
52 if (ref_count < 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000053 WEBRTC_TRACE(kTraceWarning, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000054 "ViERender release too many times");
55 return -1;
56 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000057 WEBRTC_TRACE(kTraceInfo, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000058 "ViERender reference count: %d", ref_count);
59 return ref_count;
niklase@google.com470e71d2011-07-07 08:21:25 +000060}
61
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000062ViERenderImpl::ViERenderImpl(ViESharedData* shared_data)
63 : shared_data_(shared_data) {
64 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000065 "ViERenderImpl::ViERenderImpl() Ctor");
niklase@google.com470e71d2011-07-07 08:21:25 +000066}
67
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000068ViERenderImpl::~ViERenderImpl() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000069 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_->instance_id(),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000070 "ViERenderImpl::~ViERenderImpl() Dtor");
niklase@google.com470e71d2011-07-07 08:21:25 +000071}
72
niklase@google.com470e71d2011-07-07 08:21:25 +000073int ViERenderImpl::RegisterVideoRenderModule(
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000074 VideoRender& render_module) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000075 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000076 "%s (&render_module: %p)", __FUNCTION__, &render_module);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000077 if (shared_data_->render_manager()->RegisterVideoRenderModule(
mflodman@webrtc.orgcee447a2012-06-28 07:29:46 +000078 &render_module) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000079 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000080 return -1;
81 }
82 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000083}
84
niklase@google.com470e71d2011-07-07 08:21:25 +000085int ViERenderImpl::DeRegisterVideoRenderModule(
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000086 VideoRender& render_module) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000087 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000088 "%s (&render_module: %p)", __FUNCTION__, &render_module);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000089 if (shared_data_->render_manager()->DeRegisterVideoRenderModule(
mflodman@webrtc.orgcee447a2012-06-28 07:29:46 +000090 &render_module) != 0) {
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000091 // Error logging is done in ViERenderManager::DeRegisterVideoRenderModule.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000092 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000093 return -1;
94 }
95 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000096}
97
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000098int ViERenderImpl::AddRenderer(const int render_id, void* window,
99 const unsigned int z_order, const float left,
niklase@google.com470e71d2011-07-07 08:21:25 +0000100 const float top, const float right,
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000101 const float bottom) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000102 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000103 "%s (render_id: %d, window: 0x%p, z_order: %u, left: %f, "
104 "top: %f, right: %f, bottom: %f)",
105 __FUNCTION__, render_id, window, z_order, left, top, right,
106 bottom);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000107 if (!shared_data_->Initialized()) {
108 shared_data_->SetLastError(kViENotInitialized);
109 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000110 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000111 shared_data_->instance_id());
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000112 return -1;
113 }
114 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000115 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000116 if (rs.Renderer(render_id)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000117 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000118 "%s - Renderer already exist %d.", __FUNCTION__,
119 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000120 shared_data_->SetLastError(kViERenderAlreadyExists);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000121 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000122 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000123 }
124 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
125 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000126 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000127 ViEFrameProviderBase* frame_provider = cm.Channel(render_id);
128 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000129 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000130 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
131 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000132 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000133 return -1;
134 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000135 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
136 render_id, window, z_order, left, top, right, bottom);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000137 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000138 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000139 return -1;
140 }
141 return frame_provider->RegisterFrameCallback(render_id, renderer);
142 } else {
143 // Camera or file.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000144 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000145 ViEFrameProviderBase* frame_provider = is.FrameProvider(render_id);
146 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000147 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000148 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
149 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000150 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000151 return -1;
152 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000153 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
154 render_id, window, z_order, left, top, right, bottom);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000155 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000156 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000157 return -1;
158 }
159 return frame_provider->RegisterFrameCallback(render_id, renderer);
160 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000161}
niklase@google.com470e71d2011-07-07 08:21:25 +0000162
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000163int ViERenderImpl::RemoveRenderer(const int render_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000164 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000165 "%s(render_id: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000166 if (!shared_data_->Initialized()) {
167 shared_data_->SetLastError(kViENotInitialized);
168 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000169 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000170 shared_data_->instance_id());
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000171 return -1;
172 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000173
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000174 ViERenderer* renderer = NULL;
175 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000176 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000177 renderer = rs.Renderer(render_id);
178 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000179 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
180 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000181 "%s No render exist with render_id: %d", __FUNCTION__,
182 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000183 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000184 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000185 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000186 // Leave the scope lock since we don't want to lock two managers
187 // simultanousely.
188 }
189 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
190 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000191 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000192 ViEChannel* channel = cm.Channel(render_id);
193 if (!channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000194 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
195 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000196 "%s: no channel with id %d exists ", __FUNCTION__,
197 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000198 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000199 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000200 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000201 channel->DeregisterFrameCallback(renderer);
202 } else {
203 // Provider owned by inputmanager, i.e. file or capture device.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000204 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000205 ViEFrameProviderBase* provider = is.FrameProvider(render_id);
206 if (!provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000207 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
208 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000209 "%s: no provider with id %d exists ", __FUNCTION__,
210 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000211 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000212 return -1;
213 }
214 provider->DeregisterFrameCallback(renderer);
215 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000216 if (shared_data_->render_manager()->RemoveRenderStream(render_id) != 0) {
217 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000218 return -1;
219 }
220 return 0;
221}
222
223int ViERenderImpl::StartRender(const int render_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000224 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
225 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000226 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000227 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000228 ViERenderer* renderer = rs.Renderer(render_id);
229 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000230 WEBRTC_TRACE(kTraceError, kTraceVideo,
231 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000232 "%s: No renderer with render Id %d exist.", __FUNCTION__,
233 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000234 shared_data_->SetLastError(kViERenderInvalidRenderId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000235 return -1;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000236 }
237 if (renderer->StartRender() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000238 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000239 return -1;
240 }
241 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000242}
243
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000244int ViERenderImpl::StopRender(const int render_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000245 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
246 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000247 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000248 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000249 ViERenderer* renderer = rs.Renderer(render_id);
250 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000251 WEBRTC_TRACE(kTraceError, kTraceVideo,
252 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000253 "%s: No renderer with render_id %d exist.", __FUNCTION__,
254 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000255 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000256 return -1;
257 }
258 if (renderer->StopRender() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000259 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000260 return -1;
261 }
262 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000263}
264
mflodman@webrtc.orgf4f21452012-09-28 11:27:35 +0000265int ViERenderImpl::SetExpectedRenderDelay(int render_id, int render_delay) {
266 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
267 ViEId(shared_data_->instance_id(), render_id),
268 "%s(channel: %d)", __FUNCTION__, render_id);
269 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
270 ViERenderer* renderer = rs.Renderer(render_id);
271 if (!renderer) {
272 WEBRTC_TRACE(kTraceError, kTraceVideo,
273 ViEId(shared_data_->instance_id(), render_id),
274 "%s: No renderer with render_id %d exist.", __FUNCTION__,
275 render_id);
276 shared_data_->SetLastError(kViERenderInvalidRenderId);
277 return -1;
278 }
279 if (renderer->SetExpectedRenderDelay(render_delay) != 0) {
280 shared_data_->SetLastError(kViERenderUnknownError);
281 return -1;
282 }
283 return 0;
284}
285
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000286int ViERenderImpl::ConfigureRender(int render_id, const unsigned int z_order,
niklase@google.com470e71d2011-07-07 08:21:25 +0000287 const float left, const float top,
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000288 const float right, const float bottom) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000289 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
290 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000291 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000292 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000293 ViERenderer* renderer = rs.Renderer(render_id);
294 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000295 WEBRTC_TRACE(kTraceError, kTraceVideo,
296 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000297 "%s: No renderer with render_id %d exist.", __FUNCTION__,
298 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000299 shared_data_->SetLastError(kViERenderInvalidRenderId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000300 return -1;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000301 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000302
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000303 if (renderer->ConfigureRenderer(z_order, left, top, right, bottom) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000304 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000305 return -1;
306 }
307 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000308}
309
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000310int ViERenderImpl::MirrorRenderStream(const int render_id, const bool enable,
311 const bool mirror_xaxis,
312 const bool mirror_yaxis) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000313 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000314 ViERenderer* renderer = rs.Renderer(render_id);
315 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000316 WEBRTC_TRACE(kTraceError, kTraceVideo,
317 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000318 "%s: No renderer with render_id %d exist.", __FUNCTION__,
319 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000320 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000321 return -1;
322 }
323 if (renderer->EnableMirroring(render_id, enable, mirror_xaxis, mirror_yaxis)
324 != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000325 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000326 return -1;
327 }
328 return 0;
329}
330
331int ViERenderImpl::AddRenderer(const int render_id,
332 RawVideoType video_input_format,
333 ExternalRenderer* external_renderer) {
334 // Check if the client requested a format that we can convert the frames to.
335 if (video_input_format != kVideoI420 &&
336 video_input_format != kVideoYV12 &&
337 video_input_format != kVideoYUY2 &&
338 video_input_format != kVideoUYVY &&
339 video_input_format != kVideoARGB &&
340 video_input_format != kVideoRGB24 &&
341 video_input_format != kVideoRGB565 &&
342 video_input_format != kVideoARGB4444 &&
343 video_input_format != kVideoARGB1555) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000344 WEBRTC_TRACE(kTraceError, kTraceVideo,
345 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000346 "%s: Unsupported video frame format requested",
347 __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000348 shared_data_->SetLastError(kViERenderInvalidFrameFormat);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000349 return -1;
350 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000351 if (!shared_data_->Initialized()) {
352 shared_data_->SetLastError(kViENotInitialized);
353 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000354 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000355 shared_data_->instance_id());
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000356 return -1;
357 }
358 {
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000359 // Verify the renderer doesn't exist.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000360 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000361 if (rs.Renderer(render_id)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000362 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000363 "%s - Renderer already exist %d.", __FUNCTION__,
364 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000365 shared_data_->SetLastError(kViERenderAlreadyExists);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000366 return -1;
367 }
368 }
369 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
370 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000371 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000372 ViEFrameProviderBase* frame_provider = cm.Channel(render_id);
373 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000374 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000375 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
376 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000377 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000378 return -1;
379 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000380 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
381 render_id, NULL, 0, 0.0f, 0.0f, 1.0f, 1.0f);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000382 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000383 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000384 return -1;
385 }
386 if (renderer->SetExternalRenderer(render_id, video_input_format,
387 external_renderer) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000388 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000389 return -1;
390 }
391
392 return frame_provider->RegisterFrameCallback(render_id, renderer);
393 } else {
394 // Camera or file.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000395 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000396 ViEFrameProviderBase* frame_provider = is.FrameProvider(render_id);
397 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000398 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000399 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
400 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000401 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000402 return -1;
403 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000404 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
405 render_id, NULL, 0, 0.0f, 0.0f, 1.0f, 1.0f);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000406 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000407 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000408 return -1;
409 }
410 if (renderer->SetExternalRenderer(render_id, video_input_format,
411 external_renderer) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000412 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000413 return -1;
414 }
415 return frame_provider->RegisterFrameCallback(render_id, renderer);
416 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000417}
418
419} // namespace webrtc