blob: e044bfac9287d29e2754652e607f7a50a3ade517 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
mflodman@webrtc.orgca8d7882012-05-28 18:56:20 +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
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000011#include "webrtc/video_engine/vie_render_manager.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000013#include "webrtc/engine_configurations.h"
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"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000016#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
17#include "webrtc/system_wrappers/interface/rw_lock_wrapper.h"
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000018#include "webrtc/system_wrappers/interface/logging.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000019#include "webrtc/video_engine/vie_defines.h"
20#include "webrtc/video_engine/vie_renderer.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000021
22namespace webrtc {
23
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000024ViERenderManagerScoped::ViERenderManagerScoped(
25 const ViERenderManager& vie_render_manager)
26 : ViEManagerScopedBase(vie_render_manager) {
niklase@google.com470e71d2011-07-07 08:21:25 +000027}
28
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000029ViERenderer* ViERenderManagerScoped::Renderer(int32_t render_id) const {
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000030 return static_cast<const ViERenderManager*>(vie_manager_)->ViERenderPtr(
31 render_id);
niklase@google.com470e71d2011-07-07 08:21:25 +000032}
33
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000034ViERenderManager::ViERenderManager(int32_t engine_id)
mflodman@webrtc.orgd32c4472011-12-22 14:17:53 +000035 : list_cs_(CriticalSectionWrapper::CreateCriticalSection()),
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000036 engine_id_(engine_id),
37 use_external_render_module_(false) {
niklase@google.com470e71d2011-07-07 08:21:25 +000038}
39
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000040ViERenderManager::~ViERenderManager() {
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +000041 for (RendererMap::iterator it = stream_to_vie_renderer_.begin();
42 it != stream_to_vie_renderer_.end();
43 ++it) {
44 // The renderer is deleted in RemoveRenderStream.
45 RemoveRenderStream(it->first);
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000046 }
niklase@google.com470e71d2011-07-07 08:21:25 +000047}
48
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000049int32_t ViERenderManager::RegisterVideoRenderModule(
mflodman@webrtc.orgcee447a2012-06-28 07:29:46 +000050 VideoRender* render_module) {
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000051 // See if there is already a render module registered for the window that
52 // the registrant render module is associated with.
mflodman@webrtc.orgcee447a2012-06-28 07:29:46 +000053 VideoRender* current_module = FindRenderModule(render_module->Window());
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000054 if (current_module) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000055 LOG_F(LS_ERROR) << "A render module is already registered for this window.";
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000056 return -1;
57 }
niklase@google.com470e71d2011-07-07 08:21:25 +000058
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000059 // Register module.
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000060 render_list_.push_back(render_module);
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000061 use_external_render_module_ = true;
62 return 0;
63}
64
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000065int32_t ViERenderManager::DeRegisterVideoRenderModule(
mflodman@webrtc.orgcee447a2012-06-28 07:29:46 +000066 VideoRender* render_module) {
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000067 // Check if there are streams in the module.
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000068 uint32_t n_streams = render_module->GetNumIncomingRenderStreams();
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000069 if (n_streams != 0) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000070 LOG(LS_ERROR) << "There are still " << n_streams
71 << "in this module, cannot de-register.";
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000072 return -1;
73 }
74
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000075 for (RenderList::iterator iter = render_list_.begin();
76 iter != render_list_.end(); ++iter) {
77 if (render_module == *iter) {
78 // We've found our renderer. Erase the render module from the map.
79 render_list_.erase(iter);
80 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000081 }
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000082 }
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000083
84 LOG(LS_ERROR) << "Module not registered.";
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +000085 return -1;
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000086}
niklase@google.com470e71d2011-07-07 08:21:25 +000087
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000088ViERenderer* ViERenderManager::AddRenderStream(const int32_t render_id,
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000089 void* window,
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000090 const uint32_t z_order,
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +000091 const float left,
92 const float top,
93 const float right,
94 const float bottom) {
mflodman@webrtc.orgd32c4472011-12-22 14:17:53 +000095 CriticalSectionScoped cs(list_cs_.get());
niklase@google.com470e71d2011-07-07 08:21:25 +000096
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +000097 if (stream_to_vie_renderer_.find(render_id) !=
98 stream_to_vie_renderer_.end()) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +000099 LOG(LS_ERROR) << "Render stream already exists";
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000100 return NULL;
101 }
102
103 // Get the render module for this window.
104 VideoRender* render_module = FindRenderModule(window);
105 if (render_module == NULL) {
106 // No render module for this window, create a new one.
107 render_module = VideoRender::CreateVideoRender(ViEModuleId(engine_id_, -1),
108 window, false);
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000109 if (!render_module)
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000110 return NULL;
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000111
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +0000112 render_list_.push_back(render_module);
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000113 }
114
115 ViERenderer* vie_renderer = ViERenderer::CreateViERenderer(render_id,
116 engine_id_,
117 *render_module,
118 *this, z_order,
119 left, top, right,
120 bottom);
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000121 if (!vie_renderer)
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000122 return NULL;
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000123
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000124 stream_to_vie_renderer_[render_id] = vie_renderer;
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000125 return vie_renderer;
126}
127
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000128int32_t ViERenderManager::RemoveRenderStream(
129 const int32_t render_id) {
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000130 // We need exclusive right to the items in the render manager to delete a
131 // stream.
mflodman@webrtc.orgcee447a2012-06-28 07:29:46 +0000132 ViEManagerWriteScoped scope(this);
mflodman@webrtc.orgd32c4472011-12-22 14:17:53 +0000133 CriticalSectionScoped cs(list_cs_.get());
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000134 RendererMap::iterator it = stream_to_vie_renderer_.find(render_id);
135 if (it == stream_to_vie_renderer_.end()) {
pbos@webrtc.org4e2806d2014-05-14 08:02:22 +0000136 LOG(LS_ERROR) << "No renderer found for render_id: " << render_id;
niklase@google.com470e71d2011-07-07 08:21:25 +0000137 return 0;
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000138 }
139
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000140 // Get the render module pointer for this vie_render object.
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000141 VideoRender& renderer = it->second->RenderModule();
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000142
143 // Delete the vie_render.
144 // This deletes the stream in the render module.
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000145 delete it->second;
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000146
147 // Remove from the stream map.
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000148 stream_to_vie_renderer_.erase(it);
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000149
150 // Check if there are other streams in the module.
151 if (!use_external_render_module_ &&
152 renderer.GetNumIncomingRenderStreams() == 0) {
153 // Erase the render module from the map.
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +0000154 for (RenderList::iterator iter = render_list_.begin();
155 iter != render_list_.end(); ++iter) {
156 if (&renderer == *iter) {
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000157 // We've found our renderer.
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +0000158 render_list_.erase(iter);
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000159 break;
160 }
161 }
162 // Destroy the module.
163 VideoRender::DestroyVideoRender(&renderer);
164 }
165 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000166}
167
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000168VideoRender* ViERenderManager::FindRenderModule(void* window) {
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +0000169 for (RenderList::iterator iter = render_list_.begin();
170 iter != render_list_.end(); ++iter) {
171 if ((*iter)->Window() == window) {
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000172 // We've found the render module.
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +0000173 return *iter;
niklase@google.com470e71d2011-07-07 08:21:25 +0000174 }
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000175 }
henrike@webrtc.org79cf3ac2014-01-13 15:21:30 +0000176 return NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +0000177}
178
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000179ViERenderer* ViERenderManager::ViERenderPtr(int32_t render_id) const {
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000180 RendererMap::const_iterator it = stream_to_vie_renderer_.find(render_id);
181 if (it == stream_to_vie_renderer_.end())
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000182 return NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +0000183
pbos@webrtc.org4ca7d3f2013-08-12 19:51:57 +0000184 return it->second;
niklase@google.com470e71d2011-07-07 08:21:25 +0000185}
186
mflodman@webrtc.org02afbea2011-12-14 18:50:47 +0000187} // namespace webrtc