• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // WebRtc includes
15 #include "webrtc/modules/video_render/windows/i_video_render_win.h"
16 
17 #include <d3d9.h>
18 #include <d3dx9.h>
19 #include <ddraw.h>
20 
21 #include <Map>
22 
23 // Added
24 #include "webrtc/modules/video_render/include/video_render_defines.h"
25 
26 #pragma comment(lib, "d3d9.lib")       // located in DirectX SDK
27 
28 namespace webrtc {
29 class CriticalSectionWrapper;
30 class EventWrapper;
31 class Trace;
32 class ThreadWrapper;
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 changes
44     virtual int FrameSizeChange(int width, int height, int numberOfStreams);
45 
46     // A new frame is delivered.
47     virtual int DeliverFrame(const I420VideoFrame& videoFrame);
48     virtual int32_t RenderFrame(const uint32_t streamId,
49                                 I420VideoFrame& 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     ThreadWrapper* _screenUpdateThread;
209     EventWrapper* _screenUpdateEvent;
210 
211     HWND _hWnd;
212     bool _fullScreen;
213     RECT _originalHwndRect;
214     //FIXME we probably don't need this since all the information can be get from _d3dChannels
215     int _channel;
216     //Window size
217     UINT _winWidth;
218     UINT _winHeight;
219 
220     // Device
221     LPDIRECT3D9 _pD3D; // Used to create the D3DDevice
222     LPDIRECT3DDEVICE9 _pd3dDevice; // Our rendering device
223     LPDIRECT3DVERTEXBUFFER9 _pVB; // Buffer to hold Vertices
224     LPDIRECT3DTEXTURE9 _pTextureLogo;
225 
226     std::map<int, D3D9Channel*> _d3dChannels;
227     std::multimap<int, unsigned int> _d3dZorder;
228 
229     // The position where the logo will be placed
230     float _logoLeft;
231     float _logoTop;
232     float _logoRight;
233     float _logoBottom;
234 
235     typedef HRESULT (WINAPI *DIRECT3DCREATE9EX)(UINT SDKVersion, IDirect3D9Ex**);
236     LPDIRECT3DSURFACE9 _pd3dSurface;
237 
238     DWORD GetVertexProcessingCaps();
239     int InitializeD3D(HWND hWnd, D3DPRESENT_PARAMETERS* pd3dpp);
240 
241     D3DPRESENT_PARAMETERS _d3dpp;
242     int ResetDevice();
243 
244     int UpdateVerticeBuffer(LPDIRECT3DVERTEXBUFFER9 pVB, int offset,
245                             float startWidth, float startHeight,
246                             float stopWidth, float stopHeight);
247 
248     //code for providing graphics settings
249     DWORD _totalMemory;
250     DWORD _availableMemory;
251 };
252 
253 }  // namespace webrtc
254 
255 #endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_
256