Note: We no longer publish the latest version of our code here. We primarily use a kumc-bmi github organization. The heron ETL repository, in particular, is not public. Peers in the informatics community should see MultiSiteDev for details on requesting access.

source: webrtc/webrtc/modules/video_render/windows/video_render_direct3d9.h @ 0:4bda6873e34c

pub_scrub_3792 tip
Last change on this file since 0:4bda6873e34c was 0:4bda6873e34c, checked in by Michael Prittie <mprittie@…>, 6 years ago

Scrubbed password for publication.

File size: 8.4 KB
Line 
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
28namespace webrtc {
29class CriticalSectionWrapper;
30class EventWrapper;
31class Trace;
32class ThreadWrapper;
33
34class D3D9Channel: public VideoRenderCallback
35{
36public:
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
77protected:
78
79private:
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
99class VideoRenderDirect3D9: IVideoRenderWin
100{
101public:
102    VideoRenderDirect3D9(Trace* trace, HWND hWnd, bool fullScreen);
103    ~VideoRenderDirect3D9();
104
105public:
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
185public:
186    // Get a channel by channel id
187    D3D9Channel* GetD3DChannel(int channel);
188    int UpdateRenderSurface();
189
190protected:
191    // The thread rendering the screen
192    static bool ScreenUpdateThreadProc(void* obj);
193    bool ScreenUpdateProcess();
194
195private:
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_
Note: See TracBrowser for help on using the repository browser.