15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 23c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Use of this source code is governed by a BSD-style license 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * that can be found in the LICENSE file in the root of the source 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * tree. An additional intellectual property rights grant can be found 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the file PATENTS. All contributing project authors may 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * be found in the AUTHORS file in the root of the source tree. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_LINUX_VIDEO_X11_CHANNEL_H_ 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_LINUX_VIDEO_X11_CHANNEL_H_ 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <sys/shm.h> 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "webrtc/modules/video_render/include/video_render_defines.h" 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <X11/Xlib.h> 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <X11/Xutil.h> 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <X11/extensions/XShm.h> 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace webrtc { 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CriticalSectionWrapper; 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DEFAULT_RENDER_FRAME_WIDTH 352 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DEFAULT_RENDER_FRAME_HEIGHT 288 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VideoX11Channel: public VideoRenderCallback 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochpublic: 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) VideoX11Channel(int32_t id); 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) virtual ~VideoX11Channel(); 351fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual int32_t RenderFrame(const uint32_t streamId, 37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) I420VideoFrame& videoFrame); 383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) int32_t FrameSizeChange(int32_t width, int32_t height, 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int32_t numberOfStreams); 413c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t DeliverFrame(const I420VideoFrame& videoFrame); 423c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t GetFrameSize(int32_t& width, int32_t& height); 433c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t Init(Window window, float left, float top, float right, 443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch float bottom); 453c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t ChangeWindow(Window window); 463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t 473c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch GetStreamProperties(uint32_t& zOrder, float& left, 483c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch float& top, float& right, float& bottom) const; 493c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t ReleaseWindow(); 503c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool IsPrepared() 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return _prepared; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 553c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 563c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochprivate: 573c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 583c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t 593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch CreateLocalRenderer(int32_t width, int32_t height); 603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t RemoveRenderer(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 623c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch //FIXME a better place for this method? the GetWidthHeight no longer 633c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // supported by common_video. 643c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int GetWidthHeight(VideoType type, int bufferSize, int& width, 653c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int& height); 663c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch CriticalSectionWrapper& _crit; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 693c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch Display* _display; 703c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch XShmSegmentInfo _shminfo; 713c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch XImage* _image; 723c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch Window _window; 733c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch GC _gc; 743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t _width; // incoming frame width 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int32_t _height; // incoming frame height 763c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t _outWidth; // render frame width 773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t _outHeight; // render frame height 783c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t _xPos; // position within window 793c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t _yPos; 803c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch bool _prepared; // true if ready to use 813c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch int32_t _dispCount; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 833c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch unsigned char* _buffer; 84 float _top; 85 float _left; 86 float _right; 87 float _bottom; 88 89 int32_t _Id; 90 91}; 92 93 94} // namespace webrtc 95 96#endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_LINUX_VIDEO_X11_CHANNEL_H_ 97