/* * 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. */ #ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECTDRAW_H_ #define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECTDRAW_H_ #include "typedefs.h" #include "i_video_render_win.h" #include "vplib.h" #include "ddraw.h" #include #include // Added #include "video_render_defines.h" #pragma comment(lib, "ddraw.lib") // located in DirectX SDK namespace webrtc { class CriticalSectionWrapper; class EventWrapper; class ThreadWrapper; class Trace; class VideoRenderDirectDraw; // some typedefs to make it easy to test different versions typedef IDirectDraw7 DirectDraw; typedef IDirectDrawSurface7 DirectDrawSurface; typedef DDSURFACEDESC2 DirectDrawSurfaceDesc; typedef DDSCAPS2 DirectDrawCaps; typedef std::pair ZorderPair; class WindowsThreadCpuUsage { public: WindowsThreadCpuUsage(); int GetCpuUsage(); //in % since last call DWORD LastGetCpuTime() { return _lastGetCpuUsageTime; } const enum { CPU_CHECK_INTERVAL = 1000 }; private: _int64 _lastCpuUsageTime; DWORD _lastGetCpuUsageTime; int _lastCpuUsage; HANDLE _hThread; int _cores; }; class DirectDrawStreamSettings { public: DirectDrawStreamSettings(); float _startWidth; float _stopWidth; float _startHeight; float _stopHeight; float _cropStartWidth; float _cropStopWidth; float _cropStartHeight; float _cropStopHeight; }; class DirectDrawBitmapSettings { public: DirectDrawBitmapSettings(); ~DirectDrawBitmapSettings(); int SetBitmap(Trace* trace, DirectDraw* directDraw); HBITMAP _transparentBitMap; float _transparentBitmapLeft; float _transparentBitmapRight; float _transparentBitmapTop; float _transparentBitmapBottom; int _transparentBitmapWidth; int _transparentBitmapHeight; DDCOLORKEY* _transparentBitmapColorKey; DirectDrawSurface* _transparentBitmapSurface; // size of bitmap image }; class DirectDrawTextSettings { public: DirectDrawTextSettings(); ~DirectDrawTextSettings(); int SetText(const char* text, int textLength, COLORREF colorText, COLORREF colorBg, float left, float top, float right, float bottom); char* _ptrText; WebRtc_UWord32 _textLength; COLORREF _colorRefText; COLORREF _colorRefBackground; float _textLeft; float _textRight; float _textTop; float _textBottom; bool _transparent; }; class DirectDrawChannel: public VideoRenderCallback { public: DirectDrawChannel(DirectDraw* directDraw, VideoType blitVideoType, VideoType incomingVideoType, VideoType screenVideoType, VideoRenderDirectDraw* owner); int FrameSizeChange(int width, int height, int numberOfStreams); int DeliverFrame(unsigned char* buffer, int buffeSize, unsigned int timeStamp90KHz); virtual WebRtc_Word32 RenderFrame(const WebRtc_UWord32 streamId, VideoFrame& videoFrame); int ChangeDeliverColorFormat(bool useScreenType); void AddRef(); void Release(); void SetStreamSettings(VideoRenderDirectDraw* DDObj, short streamId, float startWidth, float startHeight, float stopWidth, float stopHeight); void SetStreamCropSettings(VideoRenderDirectDraw* DDObj, short streamId, float startWidth, float startHeight, float stopWidth, float stopHeight); int GetStreamSettings(VideoRenderDirectDraw* DDObj, short streamId, float& startWidth, float& startHeight, float& stopWidth, float& stopHeight); void GetLargestSize(RECT* mixingRect); int BlitFromOffscreenBufferToMixingBuffer( VideoRenderDirectDraw* DDObj, short streamID, DirectDrawSurface* mixingSurface, RECT &dstRect, bool demuxing); bool IsOffScreenSurfaceUpdated(VideoRenderDirectDraw* DDobj); protected: virtual ~DirectDrawChannel(); private: CriticalSectionWrapper* _critSect; // protect members from change while using them int _refCount; int _width; int _height; int _numberOfStreams; bool _deliverInScreenType; bool _doubleBuffer; DirectDraw* _directDraw; DirectDrawSurface* _offScreenSurface; // size of incoming stream DirectDrawSurface* _offScreenSurfaceNext; // size of incoming stream VideoType _blitVideoType; VideoType _originalBlitVideoType; VideoType _incomingVideoType; VideoType _screenVideoType; enum { MAX_FRAMEDELIVER_TIME = 20 }; //Maximum time it might take to deliver a frame (process time in DeliverFrame) enum { MAX_NO_OF_LATE_FRAMEDELIVER_TIME = 10 }; //No of times we allow DeliverFrame process time to exceed MAX_FRAMEDELIVER_TIME before we take action. VideoFrame _tempRenderBuffer; std::map _streamIdToSettings; bool _offScreenSurfaceUpdated; VideoRenderDirectDraw* _owner; }; class VideoRenderDirectDraw: IVideoRenderWin { public: VideoRenderDirectDraw(Trace* trace, HWND hWnd, bool fullscreen); ~VideoRenderDirectDraw(); public: //IVideoRenderWin /************************************************************************** * * Init * ***************************************************************************/ virtual WebRtc_Word32 Init(); /************************************************************************** * * Incoming Streams * ***************************************************************************/ virtual VideoRenderCallback * CreateChannel(const WebRtc_UWord32 streamId, const WebRtc_UWord32 zOrder, const float left, const float top, const float right, const float bottom); virtual WebRtc_Word32 DeleteChannel(const WebRtc_UWord32 streamId); virtual WebRtc_Word32 GetStreamSettings(const WebRtc_UWord32 channel, const WebRtc_UWord16 streamId, WebRtc_UWord32& zOrder, float& left, float& top, float& right, float& bottom); /************************************************************************** * * Start/Stop * ***************************************************************************/ virtual WebRtc_Word32 StartRender(); virtual WebRtc_Word32 StopRender(); /************************************************************************** * * Properties * ***************************************************************************/ virtual bool IsFullScreen(); virtual WebRtc_Word32 SetCropping(const WebRtc_UWord32 channel, const WebRtc_UWord16 streamId, const float left, const float top, const float right, const float bottom); virtual WebRtc_Word32 SetTransparentBackground(const bool enable); virtual WebRtc_Word32 ChangeWindow(void* window); virtual WebRtc_Word32 GetGraphicsMemory(WebRtc_UWord64& totalMemory, WebRtc_UWord64& availableMemory); virtual WebRtc_Word32 SetText(const WebRtc_UWord8 textId, const WebRtc_UWord8* text, const WebRtc_Word32 textLength, const WebRtc_UWord32 colorText, const WebRtc_UWord32 colorBg, const float left, const float top, const float rigth, const float bottom); virtual WebRtc_Word32 SetBitmap(const void* bitMap, const WebRtc_UWord8 pictureId, const void* colorKey, const float left, const float top, const float right, const float bottom); virtual WebRtc_Word32 ConfigureRenderer(const WebRtc_UWord32 channel, const WebRtc_UWord16 streamId, const unsigned int zOrder, const float left, const float top, const float right, const float bottom); public: // Used for emergency stops... int Stop(); DirectDrawChannel* ShareDirectDrawChannel(int channel); DirectDrawChannel* ConfigureDirectDrawChannel(int channel, unsigned char streamID, int zOrder, float left, float top, float right, float bottom); int AddDirectDrawChannel(int channel, unsigned char streamID, int zOrder, DirectDrawChannel*); VideoType GetPerferedVideoFormat(); bool HasChannels(); bool HasChannel(int channel); bool DeliverInScreenType(); int GetChannels(std::list& channelList); // code for getting graphics settings int GetScreenResolution(int& screenWidth, int& screenHeight); int UpdateSystemCPUUsage(int systemCPU); int SetBitmap(HBITMAP bitMap, unsigned char pictureId, DDCOLORKEY* colorKey, float left, float top, float rigth, float bottom); bool IsPrimaryOrMixingSurfaceOnSystem(); bool CanBltFourCC() { return _bCanBltFourcc; } protected: static bool RemoteRenderingThreadProc(void* obj); bool RemoteRenderingProcess(); private: int CheckCapabilities(); int CreateMixingSurface(); int CreatePrimarySurface(); int FillSurface(DirectDrawSurface *pDDSurface, RECT* rect); int DrawOnSurface(unsigned char* buffer, int buffeSize); int BlitFromOffscreenBuffersToMixingBuffer(); int BlitFromBitmapBuffersToMixingBuffer(); int BlitFromTextToMixingBuffer(); bool HasHWNDChanged(); void DecideBestRenderingMode(bool hwndChanged, int totalRenderTime); // in fullscreen flip mode int WaitAndFlip(int& waitTime); int BlitFromMixingBufferToBackBuffer(); // in normal window mode int BlitFromMixingBufferToFrontBuffer(bool hwndChanged, int& waitTime); // private members Trace* _trace; CriticalSectionWrapper* _confCritSect; // protect members from change while using them bool _fullscreen; bool _demuxing; bool _transparentBackground; bool _supportTransparency; bool _canStretch; bool _canMirrorLeftRight; bool _clearMixingSurface; bool _deliverInScreenType; bool _renderModeWaitForCorrectScanLine; bool _deliverInHalfFrameRate; bool _deliverInQuarterFrameRate; bool _bCanBltFourcc; bool _frameChanged; // True if a frame has changed or bitmap or text has changed. int _processCount; HWND _hWnd; RECT _screenRect; // whole screen as a rect RECT _mixingRect; RECT _originalHwndRect; RECT _hwndRect; VideoType _incomingVideoType; VideoType _blitVideoType; VideoType _rgbVideoType; DirectDraw* _directDraw; DirectDrawSurface* _primarySurface; // size of screen DirectDrawSurface* _backSurface; // size of screen DirectDrawSurface* _mixingSurface; // size of screen std::map _bitmapSettings; std::map _textSettings; std::map _directDrawChannels; std::multimap _directDrawZorder; EventWrapper* _fullScreenWaitEvent; EventWrapper* _screenEvent; ThreadWrapper* _screenRenderThread; WindowsThreadCpuUsage _screenRenderCpuUsage; int _lastRenderModeCpuUsage; // Used for emergency stop caused by OnDisplayChange bool _blit; //code for providing graphics settings DWORD _totalMemory; DWORD _availableMemory; int _systemCPUUsage; // Variables used for checking render time int _maxAllowedRenderTime; int _nrOfTooLongRenderTimes; bool _isPrimaryOrMixingSurfaceOnSystem; }; } //namespace webrtc #endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECTDRAW_H_