1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_ 12 #define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_ 13 14 #include "webrtc/modules/video_render/windows/i_video_render_win.h" 15 16 #include <d3d9.h> 17 #include <ddraw.h> 18 19 #include <Map> 20 21 // Added 22 #include "webrtc/base/platform_thread.h" 23 #include "webrtc/modules/video_render/video_render_defines.h" 24 25 #pragma comment(lib, "d3d9.lib") // located in DirectX SDK 26 27 namespace webrtc { 28 class CriticalSectionWrapper; 29 class EventTimerWrapper; 30 class Trace; 31 32 class D3D9Channel: public VideoRenderCallback 33 { 34 public: 35 D3D9Channel(LPDIRECT3DDEVICE9 pd3DDevice, 36 CriticalSectionWrapper* critSect, Trace* trace); 37 38 virtual ~D3D9Channel(); 39 40 // Inherited from VideoRencerCallback, called from VideoAPI class. 41 // Called when the incomming frame size and/or number of streams in mix changes 42 virtual int FrameSizeChange(int width, int height, int numberOfStreams); 43 44 // A new frame is delivered. 45 virtual int DeliverFrame(const VideoFrame& videoFrame); 46 virtual int32_t RenderFrame(const uint32_t streamId, 47 const VideoFrame& videoFrame); 48 49 // Called to check if the video frame is updated. 50 int IsUpdated(bool& isUpdated); 51 // Called after the video frame has been render to the screen 52 int RenderOffFrame(); 53 // Called to get the texture that contains the video frame 54 LPDIRECT3DTEXTURE9 GetTexture(); 55 // Called to get the texture(video frame) size 56 int GetTextureWidth(); 57 int GetTextureHeight(); 58 // 59 void SetStreamSettings(uint16_t streamId, 60 uint32_t zOrder, 61 float startWidth, 62 float startHeight, 63 float stopWidth, 64 float stopHeight); 65 int GetStreamSettings(uint16_t streamId, 66 uint32_t& zOrder, 67 float& startWidth, 68 float& startHeight, 69 float& stopWidth, 70 float& stopHeight); 71 72 int ReleaseTexture(); 73 int RecreateTexture(LPDIRECT3DDEVICE9 pd3DDevice); 74 75 protected: 76 77 private: 78 //critical section passed from the owner 79 CriticalSectionWrapper* _critSect; 80 LPDIRECT3DDEVICE9 _pd3dDevice; 81 LPDIRECT3DTEXTURE9 _pTexture; 82 83 bool _bufferIsUpdated; 84 // the frame size 85 int _width; 86 int _height; 87 //sream settings 88 //TODO support multiple streams in one channel 89 uint16_t _streamId; 90 uint32_t _zOrder; 91 float _startWidth; 92 float _startHeight; 93 float _stopWidth; 94 float _stopHeight; 95 }; 96 97 class VideoRenderDirect3D9: IVideoRenderWin 98 { 99 public: 100 VideoRenderDirect3D9(Trace* trace, HWND hWnd, bool fullScreen); 101 ~VideoRenderDirect3D9(); 102 103 public: 104 //IVideoRenderWin 105 106 /************************************************************************** 107 * 108 * Init 109 * 110 ***************************************************************************/ 111 virtual int32_t Init(); 112 113 /************************************************************************** 114 * 115 * Incoming Streams 116 * 117 ***************************************************************************/ 118 virtual VideoRenderCallback 119 * CreateChannel(const uint32_t streamId, 120 const uint32_t zOrder, 121 const float left, 122 const float top, 123 const float right, 124 const float bottom); 125 126 virtual int32_t DeleteChannel(const uint32_t streamId); 127 128 virtual int32_t GetStreamSettings(const uint32_t channel, 129 const uint16_t streamId, 130 uint32_t& zOrder, 131 float& left, float& top, 132 float& right, float& bottom); 133 134 /************************************************************************** 135 * 136 * Start/Stop 137 * 138 ***************************************************************************/ 139 140 virtual int32_t StartRender(); 141 virtual int32_t StopRender(); 142 143 /************************************************************************** 144 * 145 * Properties 146 * 147 ***************************************************************************/ 148 149 virtual bool IsFullScreen(); 150 151 virtual int32_t SetCropping(const uint32_t channel, 152 const uint16_t streamId, 153 const float left, const float top, 154 const float right, const float bottom); 155 156 virtual int32_t ConfigureRenderer(const uint32_t channel, 157 const uint16_t streamId, 158 const unsigned int zOrder, 159 const float left, const float top, 160 const float right, const float bottom); 161 162 virtual int32_t SetTransparentBackground(const bool enable); 163 164 virtual int32_t ChangeWindow(void* window); 165 166 virtual int32_t GetGraphicsMemory(uint64_t& totalMemory, 167 uint64_t& availableMemory); 168 169 virtual int32_t SetText(const uint8_t textId, 170 const uint8_t* text, 171 const int32_t textLength, 172 const uint32_t colorText, 173 const uint32_t colorBg, 174 const float left, const float top, 175 const float rigth, const float bottom); 176 177 virtual int32_t SetBitmap(const void* bitMap, 178 const uint8_t pictureId, 179 const void* colorKey, 180 const float left, const float top, 181 const float right, const float bottom); 182 183 public: 184 // Get a channel by channel id 185 D3D9Channel* GetD3DChannel(int channel); 186 int UpdateRenderSurface(); 187 188 protected: 189 // The thread rendering the screen 190 static bool ScreenUpdateThreadProc(void* obj); 191 bool ScreenUpdateProcess(); 192 193 private: 194 // Init/close the d3d device 195 int InitDevice(); 196 int CloseDevice(); 197 198 // Transparent related functions 199 int SetTransparentColor(LPDIRECT3DTEXTURE9 pTexture, 200 DDCOLORKEY* transparentColorKey, 201 DWORD width, 202 DWORD height); 203 204 CriticalSectionWrapper& _refD3DCritsect; 205 Trace* _trace; 206 // TODO(pbos): Remove scoped_ptr and use PlatformThread directly. 207 rtc::scoped_ptr<rtc::PlatformThread> _screenUpdateThread; 208 EventTimerWrapper* _screenUpdateEvent; 209 210 HWND _hWnd; 211 bool _fullScreen; 212 RECT _originalHwndRect; 213 //FIXME we probably don't need this since all the information can be get from _d3dChannels 214 int _channel; 215 //Window size 216 UINT _winWidth; 217 UINT _winHeight; 218 219 // Device 220 LPDIRECT3D9 _pD3D; // Used to create the D3DDevice 221 LPDIRECT3DDEVICE9 _pd3dDevice; // Our rendering device 222 LPDIRECT3DVERTEXBUFFER9 _pVB; // Buffer to hold Vertices 223 LPDIRECT3DTEXTURE9 _pTextureLogo; 224 225 std::map<int, D3D9Channel*> _d3dChannels; 226 std::multimap<int, unsigned int> _d3dZorder; 227 228 // The position where the logo will be placed 229 float _logoLeft; 230 float _logoTop; 231 float _logoRight; 232 float _logoBottom; 233 234 typedef HRESULT (WINAPI *DIRECT3DCREATE9EX)(UINT SDKVersion, IDirect3D9Ex**); 235 LPDIRECT3DSURFACE9 _pd3dSurface; 236 237 DWORD GetVertexProcessingCaps(); 238 int InitializeD3D(HWND hWnd, D3DPRESENT_PARAMETERS* pd3dpp); 239 240 D3DPRESENT_PARAMETERS _d3dpp; 241 int ResetDevice(); 242 243 int UpdateVerticeBuffer(LPDIRECT3DVERTEXBUFFER9 pVB, int offset, 244 float startWidth, float startHeight, 245 float stopWidth, float stopHeight); 246 247 //code for providing graphics settings 248 DWORD _totalMemory; 249 DWORD _availableMemory; 250 }; 251 252 } // namespace webrtc 253 254 #endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_ 255