blob: a5e311abf8e0713ebd74ead51468d311a24e702e [file] [log] [blame]
/*
* Copyright (c) 2011 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 "video_render_linux_impl.h"
#include "critical_section_wrapper.h"
#include "trace.h"
#include "video_x11_render.h"
#include <X11/Xlib.h>
namespace webrtc {
VideoRenderLinuxImpl::VideoRenderLinuxImpl(
const WebRtc_Word32 id,
const VideoRenderType videoRenderType,
void* window, const bool fullscreen) :
_id(id),
_renderLinuxCritsect(
*CriticalSectionWrapper::CreateCriticalSection()),
_ptrWindow(window), _fullscreen(fullscreen), _ptrX11Render(NULL),
_renderType(videoRenderType)
{
}
VideoRenderLinuxImpl::~VideoRenderLinuxImpl()
{
if (_ptrX11Render)
delete _ptrX11Render;
delete &_renderLinuxCritsect;
}
WebRtc_Word32 VideoRenderLinuxImpl::Init()
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
CriticalSectionScoped cs(_renderLinuxCritsect);
_ptrX11Render = new VideoX11Render((Window) _ptrWindow);
if (!_ptrX11Render)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s",
"Failed to create instance of VideoX11Render object");
return -1;
}
int retVal = _ptrX11Render->Init();
if (retVal == -1)
{
return -1;
}
return 0;
}
WebRtc_Word32 VideoRenderLinuxImpl::ChangeUniqueId(const WebRtc_Word32 id)
{
CriticalSectionScoped cs(_renderLinuxCritsect);
_id = id;
return 0;
}
WebRtc_Word32 VideoRenderLinuxImpl::ChangeWindow(void* window)
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
CriticalSectionScoped cs(_renderLinuxCritsect);
_ptrWindow = window;
if (_ptrX11Render)
{
return _ptrX11Render->ChangeWindow((Window) window);
}
return -1;
}
VideoRenderCallback* VideoRenderLinuxImpl::AddIncomingRenderStream(
const WebRtc_UWord32 streamId,
const WebRtc_UWord32 zOrder,
const float left,
const float top,
const float right,
const float bottom)
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
CriticalSectionScoped cs(_renderLinuxCritsect);
VideoRenderCallback* renderCallback = NULL;
if (_ptrX11Render)
{
VideoX11Channel* renderChannel =
_ptrX11Render->CreateX11RenderChannel(streamId, zOrder, left,
top, right, bottom);
if (!renderChannel)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"Render channel creation failed for stream id: %d",
streamId);
return NULL;
}
renderCallback = (VideoRenderCallback *) renderChannel;
}
else
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"_ptrX11Render is NULL");
return NULL;
}
return renderCallback;
}
WebRtc_Word32 VideoRenderLinuxImpl::DeleteIncomingRenderStream(
const WebRtc_UWord32 streamId)
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
CriticalSectionScoped cs(_renderLinuxCritsect);
if (_ptrX11Render)
{
return _ptrX11Render->DeleteX11RenderChannel(streamId);
}
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::GetIncomingRenderStreamProperties(
const WebRtc_UWord32 streamId,
WebRtc_UWord32& zOrder,
float& left,
float& top,
float& right,
float& bottom) const
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
CriticalSectionScoped cs(_renderLinuxCritsect);
if (_ptrX11Render)
{
return _ptrX11Render->GetIncomingStreamProperties(streamId, zOrder,
left, top, right,
bottom);
}
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::StartRender()
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
return 0;
}
WebRtc_Word32 VideoRenderLinuxImpl::StopRender()
{
WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer, _id, "%s",
__FUNCTION__);
return 0;
}
VideoRenderType VideoRenderLinuxImpl::RenderType()
{
return kRenderX11;
}
RawVideoType VideoRenderLinuxImpl::PerferedVideoType()
{
return kVideoI420;
}
bool VideoRenderLinuxImpl::FullScreen()
{
return false;
}
WebRtc_Word32 VideoRenderLinuxImpl::GetGraphicsMemory(
WebRtc_UWord64& /*totalGraphicsMemory*/,
WebRtc_UWord64& /*availableGraphicsMemory*/) const
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s - not supported on Linux", __FUNCTION__);
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::GetScreenResolution(
WebRtc_UWord32& /*screenWidth*/,
WebRtc_UWord32& /*screenHeight*/) const
{
return -1;
}
WebRtc_UWord32 VideoRenderLinuxImpl::RenderFrameRate(const WebRtc_UWord32 /*streamId*/)
{
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::SetStreamCropping(
const WebRtc_UWord32 /*streamId*/,
const float /*left*/,
const float /*top*/,
const float /*right*/,
const float /*bottom*/)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s - not supported on Linux", __FUNCTION__);
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::SetTransparentBackground(const bool /*enable*/)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s - not supported on Linux", __FUNCTION__);
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::ConfigureRenderer(
const WebRtc_UWord32 streamId,
const unsigned int zOrder,
const float left,
const float top,
const float right,
const float bottom)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s - not supported on Linux", __FUNCTION__);
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::SetText(
const WebRtc_UWord8 textId,
const WebRtc_UWord8* text,
const WebRtc_Word32 textLength,
const WebRtc_UWord32 textColorRef,
const WebRtc_UWord32 backgroundColorRef,
const float left, const float top,
const float rigth,
const float bottom)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s - not supported on Linux", __FUNCTION__);
return -1;
}
WebRtc_Word32 VideoRenderLinuxImpl::SetBitmap(const void* bitMap,
const WebRtc_UWord8 pictureId,
const void* colorKey,
const float left,
const float top,
const float right,
const float bottom)
{
WEBRTC_TRACE(kTraceError, kTraceVideoRenderer, _id,
"%s - not supported on Linux", __FUNCTION__);
return -1;
}
} //namespace webrtc