blob: c667d4d14b8932076beab7c70f227af8ecdc855f [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.org8da24172011-12-19 14:18:41 +0000265int ViERenderImpl::ConfigureRender(int render_id, const unsigned int z_order,
niklase@google.com470e71d2011-07-07 08:21:25 +0000266 const float left, const float top,
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000267 const float right, const float bottom) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000268 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
269 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000270 "%s(channel: %d)", __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000271 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000272 ViERenderer* renderer = rs.Renderer(render_id);
273 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000274 WEBRTC_TRACE(kTraceError, kTraceVideo,
275 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000276 "%s: No renderer with render_id %d exist.", __FUNCTION__,
277 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000278 shared_data_->SetLastError(kViERenderInvalidRenderId);
niklase@google.com470e71d2011-07-07 08:21:25 +0000279 return -1;
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000280 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000281
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000282 if (renderer->ConfigureRenderer(z_order, left, top, right, bottom) != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000283 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000284 return -1;
285 }
286 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000287}
288
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000289int ViERenderImpl::MirrorRenderStream(const int render_id, const bool enable,
290 const bool mirror_xaxis,
291 const bool mirror_yaxis) {
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);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000300 return -1;
301 }
302 if (renderer->EnableMirroring(render_id, enable, mirror_xaxis, mirror_yaxis)
303 != 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;
308}
309
310int ViERenderImpl::AddRenderer(const int render_id,
311 RawVideoType video_input_format,
312 ExternalRenderer* external_renderer) {
313 // Check if the client requested a format that we can convert the frames to.
314 if (video_input_format != kVideoI420 &&
315 video_input_format != kVideoYV12 &&
316 video_input_format != kVideoYUY2 &&
317 video_input_format != kVideoUYVY &&
318 video_input_format != kVideoARGB &&
319 video_input_format != kVideoRGB24 &&
320 video_input_format != kVideoRGB565 &&
321 video_input_format != kVideoARGB4444 &&
322 video_input_format != kVideoARGB1555) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000323 WEBRTC_TRACE(kTraceError, kTraceVideo,
324 ViEId(shared_data_->instance_id(), render_id),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000325 "%s: Unsupported video frame format requested",
326 __FUNCTION__, render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000327 shared_data_->SetLastError(kViERenderInvalidFrameFormat);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000328 return -1;
329 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000330 if (!shared_data_->Initialized()) {
331 shared_data_->SetLastError(kViENotInitialized);
332 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000333 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000334 shared_data_->instance_id());
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000335 return -1;
336 }
337 {
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000338 // Verify the renderer doesn't exist.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000339 ViERenderManagerScoped rs(*(shared_data_->render_manager()));
mflodman@webrtc.org42d07f02011-12-20 13:20:36 +0000340 if (rs.Renderer(render_id)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000341 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000342 "%s - Renderer already exist %d.", __FUNCTION__,
343 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000344 shared_data_->SetLastError(kViERenderAlreadyExists);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000345 return -1;
346 }
347 }
348 if (render_id >= kViEChannelIdBase && render_id <= kViEChannelIdMax) {
349 // This is a channel.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000350 ViEChannelManagerScoped cm(*(shared_data_->channel_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000351 ViEFrameProviderBase* frame_provider = cm.Channel(render_id);
352 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000353 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000354 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
355 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000356 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000357 return -1;
358 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000359 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
360 render_id, NULL, 0, 0.0f, 0.0f, 1.0f, 1.0f);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000361 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000362 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000363 return -1;
364 }
365 if (renderer->SetExternalRenderer(render_id, video_input_format,
366 external_renderer) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000367 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000368 return -1;
369 }
370
371 return frame_provider->RegisterFrameCallback(render_id, renderer);
372 } else {
373 // Camera or file.
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000374 ViEInputManagerScoped is(*(shared_data_->input_manager()));
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000375 ViEFrameProviderBase* frame_provider = is.FrameProvider(render_id);
376 if (!frame_provider) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000377 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_->instance_id()),
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000378 "%s: FrameProvider id %d doesn't exist", __FUNCTION__,
379 render_id);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000380 shared_data_->SetLastError(kViERenderInvalidRenderId);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000381 return -1;
382 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000383 ViERenderer* renderer = shared_data_->render_manager()->AddRenderStream(
384 render_id, NULL, 0, 0.0f, 0.0f, 1.0f, 1.0f);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000385 if (!renderer) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000386 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000387 return -1;
388 }
389 if (renderer->SetExternalRenderer(render_id, video_input_format,
390 external_renderer) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000391 shared_data_->SetLastError(kViERenderUnknownError);
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000392 return -1;
393 }
394 return frame_provider->RegisterFrameCallback(render_id, renderer);
395 }
mflodman@webrtc.org8da24172011-12-19 14:18:41 +0000396}
397
398} // namespace webrtc