|  | /* | 
|  | *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "webrtc/modules/video_render/linux/video_x11_channel.h" | 
|  | #include "webrtc/modules/video_render/linux/video_x11_render.h" | 
|  |  | 
|  | #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" | 
|  | #include "webrtc/system_wrappers/interface/trace.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | VideoX11Render::VideoX11Render(Window window) : | 
|  | _window(window), | 
|  | _critSect(*CriticalSectionWrapper::CreateCriticalSection()) | 
|  | { | 
|  | } | 
|  |  | 
|  | VideoX11Render::~VideoX11Render() | 
|  | { | 
|  | delete &_critSect; | 
|  | } | 
|  |  | 
|  | int32_t VideoX11Render::Init() | 
|  | { | 
|  | CriticalSectionScoped cs(&_critSect); | 
|  |  | 
|  | _streamIdToX11ChannelMap.clear(); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int32_t VideoX11Render::ChangeWindow(Window window) | 
|  | { | 
|  | CriticalSectionScoped cs(&_critSect); | 
|  | VideoX11Channel* renderChannel = NULL; | 
|  |  | 
|  | std::map<int, VideoX11Channel*>::iterator iter = | 
|  | _streamIdToX11ChannelMap.begin(); | 
|  |  | 
|  | while (iter != _streamIdToX11ChannelMap.end()) | 
|  | { | 
|  | renderChannel = iter->second; | 
|  | if (renderChannel) | 
|  | { | 
|  | renderChannel->ChangeWindow(window); | 
|  | } | 
|  | iter++; | 
|  | } | 
|  |  | 
|  | _window = window; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | VideoX11Channel* VideoX11Render::CreateX11RenderChannel( | 
|  | int32_t streamId, | 
|  | int32_t zOrder, | 
|  | const float left, | 
|  | const float top, | 
|  | const float right, | 
|  | const float bottom) | 
|  | { | 
|  | CriticalSectionScoped cs(&_critSect); | 
|  | VideoX11Channel* renderChannel = NULL; | 
|  |  | 
|  | std::map<int, VideoX11Channel*>::iterator iter = | 
|  | _streamIdToX11ChannelMap.find(streamId); | 
|  |  | 
|  | if (iter == _streamIdToX11ChannelMap.end()) | 
|  | { | 
|  | renderChannel = new VideoX11Channel(streamId); | 
|  | if (!renderChannel) | 
|  | { | 
|  | WEBRTC_TRACE( | 
|  | kTraceError, | 
|  | kTraceVideoRenderer, | 
|  | -1, | 
|  | "Failed to create VideoX11Channel for streamId : %d", | 
|  | streamId); | 
|  | return NULL; | 
|  | } | 
|  | renderChannel->Init(_window, left, top, right, bottom); | 
|  | _streamIdToX11ChannelMap[streamId] = renderChannel; | 
|  | } | 
|  | else | 
|  | { | 
|  | WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, -1, | 
|  | "Render Channel already exists for streamId: %d", streamId); | 
|  | renderChannel = iter->second; | 
|  | } | 
|  |  | 
|  | return renderChannel; | 
|  | } | 
|  |  | 
|  | int32_t VideoX11Render::DeleteX11RenderChannel(int32_t streamId) | 
|  | { | 
|  | CriticalSectionScoped cs(&_critSect); | 
|  |  | 
|  | std::map<int, VideoX11Channel*>::iterator iter = | 
|  | _streamIdToX11ChannelMap.find(streamId); | 
|  | if (iter != _streamIdToX11ChannelMap.end()) | 
|  | { | 
|  | VideoX11Channel *renderChannel = iter->second; | 
|  | if (renderChannel) | 
|  | { | 
|  | renderChannel->ReleaseWindow(); | 
|  | delete renderChannel; | 
|  | renderChannel = NULL; | 
|  | } | 
|  | _streamIdToX11ChannelMap.erase(iter); | 
|  | } | 
|  |  | 
|  | WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, -1, | 
|  | "No VideoX11Channel object exists for stream id: %d", | 
|  | streamId); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | int32_t VideoX11Render::GetIncomingStreamProperties( | 
|  | int32_t streamId, | 
|  | uint32_t& zOrder, | 
|  | float& left, | 
|  | float& top, | 
|  | float& right, | 
|  | float& bottom) | 
|  | { | 
|  | CriticalSectionScoped cs(&_critSect); | 
|  |  | 
|  | std::map<int, VideoX11Channel*>::iterator iter = | 
|  | _streamIdToX11ChannelMap.find(streamId); | 
|  | if (iter != _streamIdToX11ChannelMap.end()) | 
|  | { | 
|  | VideoX11Channel *renderChannel = iter->second; | 
|  | if (renderChannel) | 
|  | { | 
|  | renderChannel->GetStreamProperties(zOrder, left, top, right, bottom); | 
|  | } | 
|  | } | 
|  |  | 
|  | WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, -1, | 
|  | "No VideoX11Channel object exists for stream id: %d", | 
|  | streamId); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |