/* * 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::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::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::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::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