1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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
11 #include "webrtc/modules/video_render/linux/video_render_linux_impl.h"
12
13 #include "webrtc/modules/video_render/linux/video_x11_render.h"
14 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
15 #include "webrtc/system_wrappers/interface/trace.h"
16
17 #include <X11/Xlib.h>
18
19 namespace webrtc {
20
VideoRenderLinuxImpl(const int32_t id,const VideoRenderType videoRenderType,void * window,const bool fullscreen)21 VideoRenderLinuxImpl::VideoRenderLinuxImpl(
22 const int32_t id,
23 const VideoRenderType videoRenderType,
24 void* window, const bool fullscreen) :
25 _id(id),
26 _renderLinuxCritsect(
27 *CriticalSectionWrapper::CreateCriticalSection()),
28 _ptrWindow(window), _ptrX11Render(NULL)
29 {
30 }
31
~VideoRenderLinuxImpl()32 VideoRenderLinuxImpl::~VideoRenderLinuxImpl()
33 {
34 if (_ptrX11Render)
35 delete _ptrX11Render;
36
37 delete &_renderLinuxCritsect;
38 }
39
Init()40 int32_t VideoRenderLinuxImpl::Init()
41 {
42 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
43 __FUNCTION__);
44
45 CriticalSectionScoped cs(&_renderLinuxCritsect);
46 _ptrX11Render = new VideoX11Render((Window) _ptrWindow);
47 if (!_ptrX11Render)
48 {
49 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
50 "%s",
51 "Failed to create instance of VideoX11Render object");
52 return -1;
53 }
54 int retVal = _ptrX11Render->Init();
55 if (retVal == -1)
56 {
57 return -1;
58 }
59
60 return 0;
61
62 }
63
ChangeUniqueId(const int32_t id)64 int32_t VideoRenderLinuxImpl::ChangeUniqueId(const int32_t id)
65 {
66 CriticalSectionScoped cs(&_renderLinuxCritsect);
67
68 _id = id;
69 return 0;
70 }
71
ChangeWindow(void * window)72 int32_t VideoRenderLinuxImpl::ChangeWindow(void* window)
73 {
74 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
75 __FUNCTION__);
76
77 CriticalSectionScoped cs(&_renderLinuxCritsect);
78 _ptrWindow = window;
79
80 if (_ptrX11Render)
81 {
82 return _ptrX11Render->ChangeWindow((Window) window);
83 }
84
85 return -1;
86 }
87
AddIncomingRenderStream(const uint32_t streamId,const uint32_t zOrder,const float left,const float top,const float right,const float bottom)88 VideoRenderCallback* VideoRenderLinuxImpl::AddIncomingRenderStream(
89 const uint32_t streamId,
90 const uint32_t zOrder,
91 const float left,
92 const float top,
93 const float right,
94 const float bottom)
95 {
96 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
97 __FUNCTION__);
98 CriticalSectionScoped cs(&_renderLinuxCritsect);
99
100 VideoRenderCallback* renderCallback = NULL;
101 if (_ptrX11Render)
102 {
103 VideoX11Channel* renderChannel =
104 _ptrX11Render->CreateX11RenderChannel(streamId, zOrder, left,
105 top, right, bottom);
106 if (!renderChannel)
107 {
108 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
109 "Render channel creation failed for stream id: %d",
110 streamId);
111 return NULL;
112 }
113 renderCallback = (VideoRenderCallback *) renderChannel;
114 }
115 else
116 {
117 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
118 "_ptrX11Render is NULL");
119 return NULL;
120 }
121 return renderCallback;
122 }
123
DeleteIncomingRenderStream(const uint32_t streamId)124 int32_t VideoRenderLinuxImpl::DeleteIncomingRenderStream(
125 const uint32_t streamId)
126 {
127 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
128 __FUNCTION__);
129 CriticalSectionScoped cs(&_renderLinuxCritsect);
130
131 if (_ptrX11Render)
132 {
133 return _ptrX11Render->DeleteX11RenderChannel(streamId);
134 }
135 return -1;
136 }
137
GetIncomingRenderStreamProperties(const uint32_t streamId,uint32_t & zOrder,float & left,float & top,float & right,float & bottom) const138 int32_t VideoRenderLinuxImpl::GetIncomingRenderStreamProperties(
139 const uint32_t streamId,
140 uint32_t& zOrder,
141 float& left,
142 float& top,
143 float& right,
144 float& bottom) const
145 {
146 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
147 __FUNCTION__);
148 CriticalSectionScoped cs(&_renderLinuxCritsect);
149
150 if (_ptrX11Render)
151 {
152 return _ptrX11Render->GetIncomingStreamProperties(streamId, zOrder,
153 left, top, right,
154 bottom);
155 }
156 return -1;
157 }
158
StartRender()159 int32_t VideoRenderLinuxImpl::StartRender()
160 {
161 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
162 __FUNCTION__);
163 return 0;
164 }
165
StopRender()166 int32_t VideoRenderLinuxImpl::StopRender()
167 {
168 WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
169 __FUNCTION__);
170 return 0;
171 }
172
RenderType()173 VideoRenderType VideoRenderLinuxImpl::RenderType()
174 {
175 return kRenderX11;
176 }
177
PerferedVideoType()178 RawVideoType VideoRenderLinuxImpl::PerferedVideoType()
179 {
180 return kVideoI420;
181 }
182
FullScreen()183 bool VideoRenderLinuxImpl::FullScreen()
184 {
185 return false;
186 }
187
GetGraphicsMemory(uint64_t &,uint64_t &) const188 int32_t VideoRenderLinuxImpl::GetGraphicsMemory(
189 uint64_t& /*totalGraphicsMemory*/,
190 uint64_t& /*availableGraphicsMemory*/) const
191 {
192 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
193 "%s - not supported on Linux", __FUNCTION__);
194 return -1;
195 }
196
GetScreenResolution(uint32_t &,uint32_t &) const197 int32_t VideoRenderLinuxImpl::GetScreenResolution(
198 uint32_t& /*screenWidth*/,
199 uint32_t& /*screenHeight*/) const
200 {
201 return -1;
202 }
203
RenderFrameRate(const uint32_t)204 uint32_t VideoRenderLinuxImpl::RenderFrameRate(const uint32_t /*streamId*/)
205 {
206 return -1;
207 }
208
SetStreamCropping(const uint32_t,const float,const float,const float,const float)209 int32_t VideoRenderLinuxImpl::SetStreamCropping(
210 const uint32_t /*streamId*/,
211 const float /*left*/,
212 const float /*top*/,
213 const float /*right*/,
214 const float /*bottom*/)
215 {
216 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
217 "%s - not supported on Linux", __FUNCTION__);
218 return -1;
219 }
220
SetTransparentBackground(const bool)221 int32_t VideoRenderLinuxImpl::SetTransparentBackground(const bool /*enable*/)
222 {
223 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
224 "%s - not supported on Linux", __FUNCTION__);
225 return -1;
226 }
227
ConfigureRenderer(const uint32_t streamId,const unsigned int zOrder,const float left,const float top,const float right,const float bottom)228 int32_t VideoRenderLinuxImpl::ConfigureRenderer(
229 const uint32_t streamId,
230 const unsigned int zOrder,
231 const float left,
232 const float top,
233 const float right,
234 const float bottom)
235 {
236 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
237 "%s - not supported on Linux", __FUNCTION__);
238 return -1;
239 }
240
SetText(const uint8_t textId,const uint8_t * text,const int32_t textLength,const uint32_t textColorRef,const uint32_t backgroundColorRef,const float left,const float top,const float rigth,const float bottom)241 int32_t VideoRenderLinuxImpl::SetText(
242 const uint8_t textId,
243 const uint8_t* text,
244 const int32_t textLength,
245 const uint32_t textColorRef,
246 const uint32_t backgroundColorRef,
247 const float left, const float top,
248 const float rigth,
249 const float bottom)
250 {
251 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
252 "%s - not supported on Linux", __FUNCTION__);
253 return -1;
254 }
255
SetBitmap(const void * bitMap,const uint8_t pictureId,const void * colorKey,const float left,const float top,const float right,const float bottom)256 int32_t VideoRenderLinuxImpl::SetBitmap(const void* bitMap,
257 const uint8_t pictureId,
258 const void* colorKey,
259 const float left,
260 const float top,
261 const float right,
262 const float bottom)
263 {
264 WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
265 "%s - not supported on Linux", __FUNCTION__);
266 return -1;
267 }
268
269 } // namespace webrtc
270