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