blob: e790661e904c0e5e23752ab6f151b11e3b0d73ac [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.
*/
#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 "common_video/libyuv/include/libyuv.h"
#include "ddraw.h"
#include <Map>
#include <List>
// 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<int, unsigned int> 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<unsigned long long, DirectDrawStreamSettings*>
_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<int>& 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<unsigned char, DirectDrawBitmapSettings*> _bitmapSettings;
std::map<unsigned char, DirectDrawTextSettings*> _textSettings;
std::map<int, DirectDrawChannel*> _directDrawChannels;
std::multimap<int, unsigned int> _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_