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