/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef EVRD3DPRESENTENGINE_H #define EVRD3DPRESENTENGINE_H #include #include #include #include #if defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC) # include # define MAYBE_ANGLE #endif struct IDirect3D9Ex; struct IDirect3DDevice9Ex; struct IDirect3DDeviceManager9; struct IDirect3DSurface9; struct IDirect3DTexture9; struct IMFSample; struct IMFMediaType; // Randomly generated GUIDs static const GUID MFSamplePresenter_SampleCounter = { 0xb0bb83cc, 0xf10f, 0x4e2e, { 0xaa, 0x2b, 0x29, 0xea, 0x5e, 0x92, 0xef, 0x85 } }; QT_BEGIN_NAMESPACE class QAbstractVideoSurface; #ifdef MAYBE_ANGLE class OpenGLResources; class EGLWrapper { Q_DISABLE_COPY(EGLWrapper) public: EGLWrapper(); __eglMustCastToProperFunctionPointerType getProcAddress(const char *procname); EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); EGLBoolean destroySurface(EGLDisplay dpy, EGLSurface surface); EGLBoolean bindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); EGLBoolean releaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); private: typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP EglGetProcAddress)(const char *procname); typedef EGLSurface (EGLAPIENTRYP EglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); typedef EGLBoolean (EGLAPIENTRYP EglDestroySurface)(EGLDisplay dpy, EGLSurface surface); typedef EGLBoolean (EGLAPIENTRYP EglBindTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); typedef EGLBoolean (EGLAPIENTRYP EglReleaseTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); EglGetProcAddress m_eglGetProcAddress; EglCreatePbufferSurface m_eglCreatePbufferSurface; EglDestroySurface m_eglDestroySurface; EglBindTexImage m_eglBindTexImage; EglReleaseTexImage m_eglReleaseTexImage; }; #endif // MAYBE_ANGLE class D3DPresentEngine { Q_DISABLE_COPY(D3DPresentEngine) public: enum Hint { RenderToTexture }; D3DPresentEngine(); virtual ~D3DPresentEngine(); bool isValid() const; void setHint(Hint hint, bool enable = true); HRESULT getService(REFGUID guidService, REFIID riid, void** ppv); HRESULT checkFormat(D3DFORMAT format); UINT refreshRate() const { return m_displayMode.RefreshRate; } bool supportsTextureRendering() const; bool isTextureRenderingEnabled() const { return m_useTextureRendering; } HRESULT createVideoSamples(IMFMediaType *format, QList& videoSampleQueue, QSize frameSize); QVideoSurfaceFormat videoSurfaceFormat() const { return m_surfaceFormat; } QVideoFrame makeVideoFrame(IMFSample* sample); void releaseResources(); private: HRESULT initializeD3D(); HRESULT createD3DDevice(); UINT m_deviceResetToken; D3DDISPLAYMODE m_displayMode; IDirect3D9Ex *m_D3D9; IDirect3DDevice9Ex *m_device; IDirect3DDeviceManager9 *m_deviceManager; QVideoSurfaceFormat m_surfaceFormat; bool m_useTextureRendering; #ifdef MAYBE_ANGLE unsigned int updateTexture(IDirect3DSurface9 *src); OpenGLResources *m_glResources; IDirect3DTexture9 *m_texture; #endif friend class IMFSampleVideoBuffer; }; QT_END_NAMESPACE #endif // EVRD3DPRESENTENGINE_H