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