blob: 75bc0a3667fa9eefc2e14c4ea80da537d9218e50 [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
andrew@webrtc.org9841d922012-10-31 05:22:11 +000014#include "webrtc/modules/video_render/include/video_render.h"
15#include "webrtc/modules/video_render/include/video_render_defines.h"
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000016#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 }
andrew@webrtc.orgd72262d2013-05-09 02:12:07 +000036 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000037 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)--;
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000051 int32_t ref_count = GetCount();
mflodman@webrtc.org8da24172011-12-19 14:18:41 +000052 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.org8da24172011-12-19 14:18:41 +0000107 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000108 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000109 if (rs.Renderer(render_id)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000110 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000111 "%s - Renderer already exist %d.", __FUNCTION__,
112 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000113 shared_data_->SetLastError(kViERenderAlreadyExists);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000114 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000115 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000116 }
117 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
118 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000119 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000120 ViEFrameProviderBase* frame_provider = cm.Channel(render_id);
121 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000122 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000123 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
124 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000125 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000126 return -1;
127 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000128 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
129 render_id, window, z_order, left, top, right, bottom);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000130 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000131 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000132 return -1;
133 }
134 return frame_provider->RegisterFrameCallback(render_id, renderer);
135 } else {
136 // Camera or file.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000137 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000138 ViEFrameProviderBase* frame_provider = is.FrameProvider(render_id);
139 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000140 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000141 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
142 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000143 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000144 return -1;
145 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000146 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
147 render_id, window, z_order, left, top, right, bottom);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000148 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000149 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000150 return -1;
151 }
152 return frame_provider->RegisterFrameCallback(render_id, renderer);
153 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000154}
niklase@google.com470e71d2011-07-07 08:21:25 +0000155
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000156int ViERenderImpl::RemoveRenderer(const int render_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000157 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000158 "%s(render_id: %d)", __FUNCTION__, render_id);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000159 ViERenderer* renderer = NULL;
160 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000161 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000162 renderer = rs.Renderer(render_id);
163 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000164 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
165 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000166 "%s No render exist with render_id: %d", __FUNCTION__,
167 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000168 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000169 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +0000170 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000171 // Leave the scope lock since we don't want to lock two managers
172 // simultanousely.
173 }
174 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
175 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000176 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000177 ViEChannel* channel = cm.Channel(render_id);
178 if (!channel) {
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 channel with id %d exists ", __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 channel->DeregisterFrameCallback(renderer);
187 } else {
188 // Provider owned by inputmanager, i.e. file or capture device.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000189 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000190 ViEFrameProviderBase* provider = is.FrameProvider(render_id);
191 if (!provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000192 WEBRTC_TRACE(kTraceWarning, kTraceVideo,
193 ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000194 "%s: no provider with id %d exists ", __FUNCTION__,
195 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000196 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000197 return -1;
198 }
199 provider->DeregisterFrameCallback(renderer);
200 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000201 if (shared_data_->render_manager()->RemoveRenderStream(render_id) != 0) {
202 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000203 return -1;
204 }
205 return 0;
206}
207
208int ViERenderImpl::StartRender(const int render_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000209 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
210 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000211 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000212 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000213 ViERenderer* renderer = rs.Renderer(render_id);
214 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000215 WEBRTC_TRACE(kTraceError, kTraceVideo,
216 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000217 "%s: No renderer with render Id %d exist.", __FUNCTION__,
218 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000219 shared_data_->SetLastError(kViERenderInvalidRenderId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000220 return -1;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000221 }
222 if (renderer->StartRender() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000223 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000224 return -1;
225 }
226 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000227}
228
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000229int ViERenderImpl::StopRender(const int render_id) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000230 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
231 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000232 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000233 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000234 ViERenderer* renderer = rs.Renderer(render_id);
235 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000236 WEBRTC_TRACE(kTraceError, kTraceVideo,
237 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000238 "%s: No renderer with render_id %d exist.", __FUNCTION__,
239 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000240 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000241 return -1;
242 }
243 if (renderer->StopRender() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000244 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000245 return -1;
246 }
247 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000248}
249
mflodman@webrtc.orgf4f21452012-09-28 11:27:35 +0000250int ViERenderImpl::SetExpectedRenderDelay(int render_id, int render_delay) {
251 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
252 ViEId(shared_data_->instance_id(), render_id),
253 "%s(channel: %d)", __FUNCTION__, render_id);
254 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
255 ViERenderer* renderer = rs.Renderer(render_id);
256 if (!renderer) {
257 WEBRTC_TRACE(kTraceError, kTraceVideo,
258 ViEId(shared_data_->instance_id(), render_id),
259 "%s: No renderer with render_id %d exist.", __FUNCTION__,
260 render_id);
261 shared_data_->SetLastError(kViERenderInvalidRenderId);
262 return -1;
263 }
264 if (renderer->SetExpectedRenderDelay(render_delay) != 0) {
265 shared_data_->SetLastError(kViERenderUnknownError);
266 return -1;
267 }
268 return 0;
269}
270
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000271int ViERenderImpl::ConfigureRender(int render_id, const unsigned int z_order,
niklase@google.com470e71d2011-07-07 08:21:25 +0000272 const float left, const float top,
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000273 const float right, const float bottom) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000274 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
275 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000276 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000277 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000278 ViERenderer* renderer = rs.Renderer(render_id);
279 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000280 WEBRTC_TRACE(kTraceError, kTraceVideo,
281 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000282 "%s: No renderer with render_id %d exist.", __FUNCTION__,
283 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000284 shared_data_->SetLastError(kViERenderInvalidRenderId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000285 return -1;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000286 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000287
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000288 if (renderer->ConfigureRenderer(z_order, left, top, right, bottom) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000289 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000290 return -1;
291 }
292 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000293}
294
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000295int ViERenderImpl::MirrorRenderStream(const int render_id, const bool enable,
296 const bool mirror_xaxis,
297 const bool mirror_yaxis) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000298 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000299 ViERenderer* renderer = rs.Renderer(render_id);
300 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000301 WEBRTC_TRACE(kTraceError, kTraceVideo,
302 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000303 "%s: No renderer with render_id %d exist.", __FUNCTION__,
304 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000305 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000306 return -1;
307 }
308 if (renderer->EnableMirroring(render_id, enable, mirror_xaxis, mirror_yaxis)
309 != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000310 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000311 return -1;
312 }
313 return 0;
314}
315
316int ViERenderImpl::AddRenderer(const int render_id,
317 RawVideoType video_input_format,
318 ExternalRenderer* external_renderer) {
319 // Check if the client requested a format that we can convert the frames to.
320 if (video_input_format != kVideoI420 &&
321 video_input_format != kVideoYV12 &&
322 video_input_format != kVideoYUY2 &&
323 video_input_format != kVideoUYVY &&
324 video_input_format != kVideoARGB &&
325 video_input_format != kVideoRGB24 &&
326 video_input_format != kVideoRGB565 &&
327 video_input_format != kVideoARGB4444 &&
328 video_input_format != kVideoARGB1555) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000329 WEBRTC_TRACE(kTraceError, kTraceVideo,
330 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000331 "%s: Unsupported video frame format requested",
332 __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000333 shared_data_->SetLastError(kViERenderInvalidFrameFormat);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000334 return -1;
335 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000336 {
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000337 // Verify the renderer doesn't exist.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000338 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000339 if (rs.Renderer(render_id)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000340 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000341 "%s - Renderer already exist %d.", __FUNCTION__,
342 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000343 shared_data_->SetLastError(kViERenderAlreadyExists);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000344 return -1;
345 }
346 }
347 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
348 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000349 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000350 ViEFrameProviderBase* frame_provider = cm.Channel(render_id);
351 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000352 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000353 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
354 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000355 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000356 return -1;
357 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000358 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
359 render_id, NULL, 0, 0.0f, 0.0f, 1.0f, 1.0f);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000360 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000361 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000362 return -1;
363 }
364 if (renderer->SetExternalRenderer(render_id, video_input_format,
365 external_renderer) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000366 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000367 return -1;
368 }
369
370 return frame_provider->RegisterFrameCallback(render_id, renderer);
371 } else {
372 // Camera or file.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000373 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000374 ViEFrameProviderBase* frame_provider = is.FrameProvider(render_id);
375 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000376 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000377 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
378 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000379 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000380 return -1;
381 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000382 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
383 render_id, NULL, 0, 0.0f, 0.0f, 1.0f, 1.0f);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000384 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000385 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000386 return -1;
387 }
388 if (renderer->SetExternalRenderer(render_id, video_input_format,
389 external_renderer) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000390 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000391 return -1;
392 }
393 return frame_provider->RegisterFrameCallback(render_id, renderer);
394 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000395}
396
397} // namespace webrtc