| Index: webrtc/modules/video_render/windows/video_render_direct3d9.h
|
| diff --git a/webrtc/modules/video_render/windows/video_render_direct3d9.h b/webrtc/modules/video_render/windows/video_render_direct3d9.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eaa8c147e2e709268ea2e7db40d420cc33139124
|
| --- /dev/null
|
| +++ b/webrtc/modules/video_render/windows/video_render_direct3d9.h
|
| @@ -0,0 +1,256 @@
|
| +/*
|
| + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#ifndef WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_
|
| +#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_
|
| +
|
| +#include <memory>
|
| +
|
| +#include "webrtc/modules/video_render/windows/i_video_render_win.h"
|
| +
|
| +#include <d3d9.h>
|
| +#include <ddraw.h>
|
| +
|
| +#include <Map>
|
| +
|
| +// Added
|
| +#include "webrtc/base/platform_thread.h"
|
| +#include "webrtc/modules/video_render/video_render_defines.h"
|
| +
|
| +#pragma comment(lib, "d3d9.lib") // located in DirectX SDK
|
| +
|
| +namespace webrtc {
|
| +class CriticalSectionWrapper;
|
| +class EventTimerWrapper;
|
| +class Trace;
|
| +
|
| +class D3D9Channel: public VideoRenderCallback
|
| +{
|
| +public:
|
| + D3D9Channel(LPDIRECT3DDEVICE9 pd3DDevice,
|
| + CriticalSectionWrapper* critSect, Trace* trace);
|
| +
|
| + virtual ~D3D9Channel();
|
| +
|
| + // Inherited from VideoRencerCallback, called from VideoAPI class.
|
| + // Called when the incomming frame size and/or number of streams in mix changes
|
| + virtual int FrameSizeChange(int width, int height, int numberOfStreams);
|
| +
|
| + // A new frame is delivered.
|
| + virtual int DeliverFrame(const VideoFrame& videoFrame);
|
| + virtual int32_t RenderFrame(const uint32_t streamId,
|
| + const VideoFrame& videoFrame);
|
| +
|
| + // Called to check if the video frame is updated.
|
| + int IsUpdated(bool& isUpdated);
|
| + // Called after the video frame has been render to the screen
|
| + int RenderOffFrame();
|
| + // Called to get the texture that contains the video frame
|
| + LPDIRECT3DTEXTURE9 GetTexture();
|
| + // Called to get the texture(video frame) size
|
| + int GetTextureWidth();
|
| + int GetTextureHeight();
|
| + //
|
| + void SetStreamSettings(uint16_t streamId,
|
| + uint32_t zOrder,
|
| + float startWidth,
|
| + float startHeight,
|
| + float stopWidth,
|
| + float stopHeight);
|
| + int GetStreamSettings(uint16_t streamId,
|
| + uint32_t& zOrder,
|
| + float& startWidth,
|
| + float& startHeight,
|
| + float& stopWidth,
|
| + float& stopHeight);
|
| +
|
| + int ReleaseTexture();
|
| + int RecreateTexture(LPDIRECT3DDEVICE9 pd3DDevice);
|
| +
|
| +protected:
|
| +
|
| +private:
|
| + //critical section passed from the owner
|
| + CriticalSectionWrapper* _critSect;
|
| + LPDIRECT3DDEVICE9 _pd3dDevice;
|
| + LPDIRECT3DTEXTURE9 _pTexture;
|
| +
|
| + bool _bufferIsUpdated;
|
| + // the frame size
|
| + int _width;
|
| + int _height;
|
| + //sream settings
|
| + //TODO support multiple streams in one channel
|
| + uint16_t _streamId;
|
| + uint32_t _zOrder;
|
| + float _startWidth;
|
| + float _startHeight;
|
| + float _stopWidth;
|
| + float _stopHeight;
|
| +};
|
| +
|
| +class VideoRenderDirect3D9: IVideoRenderWin
|
| +{
|
| +public:
|
| + VideoRenderDirect3D9(Trace* trace, HWND hWnd, bool fullScreen);
|
| + ~VideoRenderDirect3D9();
|
| +
|
| +public:
|
| + //IVideoRenderWin
|
| +
|
| + /**************************************************************************
|
| + *
|
| + * Init
|
| + *
|
| + ***************************************************************************/
|
| + virtual int32_t Init();
|
| +
|
| + /**************************************************************************
|
| + *
|
| + * Incoming Streams
|
| + *
|
| + ***************************************************************************/
|
| + virtual VideoRenderCallback
|
| + * CreateChannel(const uint32_t streamId,
|
| + const uint32_t zOrder,
|
| + const float left,
|
| + const float top,
|
| + const float right,
|
| + const float bottom);
|
| +
|
| + virtual int32_t DeleteChannel(const uint32_t streamId);
|
| +
|
| + virtual int32_t GetStreamSettings(const uint32_t channel,
|
| + const uint16_t streamId,
|
| + uint32_t& zOrder,
|
| + float& left, float& top,
|
| + float& right, float& bottom);
|
| +
|
| + /**************************************************************************
|
| + *
|
| + * Start/Stop
|
| + *
|
| + ***************************************************************************/
|
| +
|
| + virtual int32_t StartRender();
|
| + virtual int32_t StopRender();
|
| +
|
| + /**************************************************************************
|
| + *
|
| + * Properties
|
| + *
|
| + ***************************************************************************/
|
| +
|
| + virtual bool IsFullScreen();
|
| +
|
| + virtual int32_t SetCropping(const uint32_t channel,
|
| + const uint16_t streamId,
|
| + const float left, const float top,
|
| + const float right, const float bottom);
|
| +
|
| + virtual int32_t ConfigureRenderer(const uint32_t channel,
|
| + const uint16_t streamId,
|
| + const unsigned int zOrder,
|
| + const float left, const float top,
|
| + const float right, const float bottom);
|
| +
|
| + virtual int32_t SetTransparentBackground(const bool enable);
|
| +
|
| + virtual int32_t ChangeWindow(void* window);
|
| +
|
| + virtual int32_t GetGraphicsMemory(uint64_t& totalMemory,
|
| + uint64_t& availableMemory);
|
| +
|
| + virtual int32_t SetText(const uint8_t textId,
|
| + const uint8_t* text,
|
| + const int32_t textLength,
|
| + const uint32_t colorText,
|
| + const uint32_t colorBg,
|
| + const float left, const float top,
|
| + const float rigth, const float bottom);
|
| +
|
| + virtual int32_t SetBitmap(const void* bitMap,
|
| + const uint8_t pictureId,
|
| + const void* colorKey,
|
| + const float left, const float top,
|
| + const float right, const float bottom);
|
| +
|
| +public:
|
| + // Get a channel by channel id
|
| + D3D9Channel* GetD3DChannel(int channel);
|
| + int UpdateRenderSurface();
|
| +
|
| +protected:
|
| + // The thread rendering the screen
|
| + static bool ScreenUpdateThreadProc(void* obj);
|
| + bool ScreenUpdateProcess();
|
| +
|
| +private:
|
| + // Init/close the d3d device
|
| + int InitDevice();
|
| + int CloseDevice();
|
| +
|
| + // Transparent related functions
|
| + int SetTransparentColor(LPDIRECT3DTEXTURE9 pTexture,
|
| + DDCOLORKEY* transparentColorKey,
|
| + DWORD width,
|
| + DWORD height);
|
| +
|
| + CriticalSectionWrapper& _refD3DCritsect;
|
| + Trace* _trace;
|
| + // TODO(pbos): Remove unique_ptr and use PlatformThread directly.
|
| + std::unique_ptr<rtc::PlatformThread> _screenUpdateThread;
|
| + EventTimerWrapper* _screenUpdateEvent;
|
| +
|
| + HWND _hWnd;
|
| + bool _fullScreen;
|
| + RECT _originalHwndRect;
|
| + //FIXME we probably don't need this since all the information can be get from _d3dChannels
|
| + int _channel;
|
| + //Window size
|
| + UINT _winWidth;
|
| + UINT _winHeight;
|
| +
|
| + // Device
|
| + LPDIRECT3D9 _pD3D; // Used to create the D3DDevice
|
| + LPDIRECT3DDEVICE9 _pd3dDevice; // Our rendering device
|
| + LPDIRECT3DVERTEXBUFFER9 _pVB; // Buffer to hold Vertices
|
| + LPDIRECT3DTEXTURE9 _pTextureLogo;
|
| +
|
| + std::map<int, D3D9Channel*> _d3dChannels;
|
| + std::multimap<int, unsigned int> _d3dZorder;
|
| +
|
| + // The position where the logo will be placed
|
| + float _logoLeft;
|
| + float _logoTop;
|
| + float _logoRight;
|
| + float _logoBottom;
|
| +
|
| + typedef HRESULT (WINAPI *DIRECT3DCREATE9EX)(UINT SDKVersion, IDirect3D9Ex**);
|
| + LPDIRECT3DSURFACE9 _pd3dSurface;
|
| +
|
| + DWORD GetVertexProcessingCaps();
|
| + int InitializeD3D(HWND hWnd, D3DPRESENT_PARAMETERS* pd3dpp);
|
| +
|
| + D3DPRESENT_PARAMETERS _d3dpp;
|
| + int ResetDevice();
|
| +
|
| + int UpdateVerticeBuffer(LPDIRECT3DVERTEXBUFFER9 pVB, int offset,
|
| + float startWidth, float startHeight,
|
| + float stopWidth, float stopHeight);
|
| +
|
| + //code for providing graphics settings
|
| + DWORD _totalMemory;
|
| + DWORD _availableMemory;
|
| +};
|
| +
|
| +} // namespace webrtc
|
| +
|
| +#endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_WINDOWS_VIDEO_RENDER_DIRECT3D9_H_
|
|
|