niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 1 | /* |
mflodman@webrtc.org | ca8d788 | 2012-05-28 18:56:20 +0000 | [diff] [blame] | 2 | * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 3 | * |
| 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.org | f5d4cb1 | 2013-05-17 13:44:48 +0000 | [diff] [blame] | 11 | #include "webrtc/video_engine/vie_render_manager.h" |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 12 | |
pbos@webrtc.org | f5d4cb1 | 2013-05-17 13:44:48 +0000 | [diff] [blame] | 13 | #include "webrtc/engine_configurations.h" |
andrew@webrtc.org | 9841d92 | 2012-10-31 05:22:11 +0000 | [diff] [blame] | 14 | #include "webrtc/modules/video_render/include/video_render.h" |
| 15 | #include "webrtc/modules/video_render/include/video_render_defines.h" |
pbos@webrtc.org | f5d4cb1 | 2013-05-17 13:44:48 +0000 | [diff] [blame] | 16 | #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
| 17 | #include "webrtc/system_wrappers/interface/rw_lock_wrapper.h" |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 18 | #include "webrtc/system_wrappers/interface/logging.h" |
pbos@webrtc.org | f5d4cb1 | 2013-05-17 13:44:48 +0000 | [diff] [blame] | 19 | #include "webrtc/video_engine/vie_defines.h" |
| 20 | #include "webrtc/video_engine/vie_renderer.h" |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 21 | |
| 22 | namespace webrtc { |
| 23 | |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 24 | ViERenderManagerScoped::ViERenderManagerScoped( |
| 25 | const ViERenderManager& vie_render_manager) |
| 26 | : ViEManagerScopedBase(vie_render_manager) { |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 27 | } |
| 28 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 29 | ViERenderer* ViERenderManagerScoped::Renderer(int32_t render_id) const { |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 30 | return static_cast<const ViERenderManager*>(vie_manager_)->ViERenderPtr( |
| 31 | render_id); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 32 | } |
| 33 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 34 | ViERenderManager::ViERenderManager(int32_t engine_id) |
mflodman@webrtc.org | d32c447 | 2011-12-22 14:17:53 +0000 | [diff] [blame] | 35 | : list_cs_(CriticalSectionWrapper::CreateCriticalSection()), |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 36 | engine_id_(engine_id), |
| 37 | use_external_render_module_(false) { |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 38 | } |
| 39 | |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 40 | ViERenderManager::~ViERenderManager() { |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 41 | 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.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 46 | } |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 47 | } |
| 48 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 49 | int32_t ViERenderManager::RegisterVideoRenderModule( |
mflodman@webrtc.org | cee447a | 2012-06-28 07:29:46 +0000 | [diff] [blame] | 50 | VideoRender* render_module) { |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 51 | // See if there is already a render module registered for the window that |
| 52 | // the registrant render module is associated with. |
mflodman@webrtc.org | cee447a | 2012-06-28 07:29:46 +0000 | [diff] [blame] | 53 | VideoRender* current_module = FindRenderModule(render_module->Window()); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 54 | if (current_module) { |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 55 | LOG_F(LS_ERROR) << "A render module is already registered for this window."; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 56 | return -1; |
| 57 | } |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 58 | |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 59 | // Register module. |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 60 | render_list_.push_back(render_module); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 61 | use_external_render_module_ = true; |
| 62 | return 0; |
| 63 | } |
| 64 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 65 | int32_t ViERenderManager::DeRegisterVideoRenderModule( |
mflodman@webrtc.org | cee447a | 2012-06-28 07:29:46 +0000 | [diff] [blame] | 66 | VideoRender* render_module) { |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 67 | // Check if there are streams in the module. |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 68 | uint32_t n_streams = render_module->GetNumIncomingRenderStreams(); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 69 | if (n_streams != 0) { |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 70 | LOG(LS_ERROR) << "There are still " << n_streams |
| 71 | << "in this module, cannot de-register."; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 72 | return -1; |
| 73 | } |
| 74 | |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 75 | 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.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 81 | } |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 82 | } |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 83 | |
| 84 | LOG(LS_ERROR) << "Module not registered."; |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 85 | return -1; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 86 | } |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 87 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 88 | ViERenderer* ViERenderManager::AddRenderStream(const int32_t render_id, |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 89 | void* window, |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 90 | const uint32_t z_order, |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 91 | const float left, |
| 92 | const float top, |
| 93 | const float right, |
| 94 | const float bottom) { |
mflodman@webrtc.org | d32c447 | 2011-12-22 14:17:53 +0000 | [diff] [blame] | 95 | CriticalSectionScoped cs(list_cs_.get()); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 96 | |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 97 | if (stream_to_vie_renderer_.find(render_id) != |
| 98 | stream_to_vie_renderer_.end()) { |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 99 | LOG(LS_ERROR) << "Render stream already exists"; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 100 | 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.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 109 | if (!render_module) |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 110 | return NULL; |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 111 | |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 112 | render_list_.push_back(render_module); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 113 | } |
| 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.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 121 | if (!vie_renderer) |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 122 | return NULL; |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 123 | |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 124 | stream_to_vie_renderer_[render_id] = vie_renderer; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 125 | return vie_renderer; |
| 126 | } |
| 127 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 128 | int32_t ViERenderManager::RemoveRenderStream( |
| 129 | const int32_t render_id) { |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 130 | // We need exclusive right to the items in the render manager to delete a |
| 131 | // stream. |
mflodman@webrtc.org | cee447a | 2012-06-28 07:29:46 +0000 | [diff] [blame] | 132 | ViEManagerWriteScoped scope(this); |
mflodman@webrtc.org | d32c447 | 2011-12-22 14:17:53 +0000 | [diff] [blame] | 133 | CriticalSectionScoped cs(list_cs_.get()); |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 134 | RendererMap::iterator it = stream_to_vie_renderer_.find(render_id); |
| 135 | if (it == stream_to_vie_renderer_.end()) { |
pbos@webrtc.org | 4e2806d | 2014-05-14 08:02:22 +0000 | [diff] [blame] | 136 | LOG(LS_ERROR) << "No renderer found for render_id: " << render_id; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 137 | return 0; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 138 | } |
| 139 | |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 140 | // Get the render module pointer for this vie_render object. |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 141 | VideoRender& renderer = it->second->RenderModule(); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 142 | |
| 143 | // Delete the vie_render. |
| 144 | // This deletes the stream in the render module. |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 145 | delete it->second; |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 146 | |
| 147 | // Remove from the stream map. |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 148 | stream_to_vie_renderer_.erase(it); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 149 | |
| 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.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 154 | for (RenderList::iterator iter = render_list_.begin(); |
| 155 | iter != render_list_.end(); ++iter) { |
| 156 | if (&renderer == *iter) { |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 157 | // We've found our renderer. |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 158 | render_list_.erase(iter); |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 159 | break; |
| 160 | } |
| 161 | } |
| 162 | // Destroy the module. |
| 163 | VideoRender::DestroyVideoRender(&renderer); |
| 164 | } |
| 165 | return 0; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 166 | } |
| 167 | |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 168 | VideoRender* ViERenderManager::FindRenderModule(void* window) { |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 169 | for (RenderList::iterator iter = render_list_.begin(); |
| 170 | iter != render_list_.end(); ++iter) { |
| 171 | if ((*iter)->Window() == window) { |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 172 | // We've found the render module. |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 173 | return *iter; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 174 | } |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 175 | } |
henrike@webrtc.org | 79cf3ac | 2014-01-13 15:21:30 +0000 | [diff] [blame] | 176 | return NULL; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 177 | } |
| 178 | |
pbos@webrtc.org | b238d12 | 2013-04-09 13:41:51 +0000 | [diff] [blame] | 179 | ViERenderer* ViERenderManager::ViERenderPtr(int32_t render_id) const { |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 180 | RendererMap::const_iterator it = stream_to_vie_renderer_.find(render_id); |
| 181 | if (it == stream_to_vie_renderer_.end()) |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 182 | return NULL; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 183 | |
pbos@webrtc.org | 4ca7d3f | 2013-08-12 19:51:57 +0000 | [diff] [blame] | 184 | return it->second; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 185 | } |
| 186 | |
mflodman@webrtc.org | 02afbea | 2011-12-14 18:50:47 +0000 | [diff] [blame] | 187 | } // namespace webrtc |