/* -LICENSE-START- ** Copyright (c) 2012 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation (the ** "Software") to use, reproduce, display, distribute, sub-license, execute, ** and transmit the Software, and to prepare derivative works of the Software, ** and to permit third-parties to whom the Software is furnished to do so, in ** accordance with: ** ** (1) if the Software is obtained from Blackmagic Design, the End User License ** Agreement for the Software Development Kit ("EULA") available at ** https://www.blackmagicdesign.com/EULA/DeckLinkSDK; or ** ** (2) if the Software is obtained from any third party, such licensing terms ** as notified by that third party, ** ** and all subject to the following: ** ** (3) the copyright notices in the Software and this entire statement, ** including the above license grant, this restriction and the following ** disclaimer, must be included in all copies of the Software, in whole or in ** part, and all derivative works of the Software, unless such copies or ** derivative works are solely in the form of machine-executable object code ** generated by a source language processor. ** ** (4) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ** DEALINGS IN THE SOFTWARE. ** ** A copy of the Software is available free of charge at ** https://www.blackmagicdesign.com/desktopvideo_sdk under the EULA. ** ** -LICENSE-END- */ #ifndef __OPENGL_COMPOSITE_H__ #define __OPENGL_COMPOSITE_H__ #include #include #include #include #include #include #include #include #include "DeckLinkAPI_h.h" #include "GLExtensions.h" #include "OpenGLRenderer.h" #include "RuntimeHost.h" #include #include #include #include #include #include class PlayoutDelegate; class CaptureDelegate; class PinnedMemoryAllocator; class ControlServer; class OscServer; class OpenGLRenderPass; class OpenGLShaderPrograms; class OpenGLComposite { public: OpenGLComposite(HWND hWnd, HDC hDC, HGLRC hRC); ~OpenGLComposite(); bool InitDeckLink(); bool Start(); bool Stop(); bool ReloadShader(); std::string GetRuntimeStateJson() const; bool AddLayer(const std::string& shaderId, std::string& error); bool RemoveLayer(const std::string& layerId, std::string& error); bool MoveLayer(const std::string& layerId, int direction, std::string& error); bool MoveLayerToIndex(const std::string& layerId, std::size_t targetIndex, std::string& error); bool SetLayerBypass(const std::string& layerId, bool bypassed, std::string& error); bool SetLayerShader(const std::string& layerId, const std::string& shaderId, std::string& error); bool UpdateLayerParameterJson(const std::string& layerId, const std::string& parameterId, const std::string& valueJson, std::string& error); bool UpdateLayerParameterByControlKeyJson(const std::string& layerKey, const std::string& parameterKey, const std::string& valueJson, std::string& error); bool ResetLayerParameters(const std::string& layerId, std::string& error); bool SaveStackPreset(const std::string& presetName, std::string& error); bool LoadStackPreset(const std::string& presetName, std::string& error); void resizeGL(WORD width, WORD height); void paintGL(); void VideoFrameArrived(IDeckLinkVideoInputFrame* inputFrame, bool hasNoInputSource); void PlayoutFrameCompleted(IDeckLinkVideoFrame* completedFrame, BMDOutputFrameCompletionResult result); private: void resizeWindow(int width, int height); bool CheckOpenGLExtensions(); using LayerProgram = OpenGLRenderer::LayerProgram; CaptureDelegate* mCaptureDelegate; PlayoutDelegate* mPlayoutDelegate; HWND hGLWnd; HDC hGLDC; HGLRC hGLRC; CRITICAL_SECTION pMutex; // DeckLink IDeckLinkInput* mDLInput; IDeckLinkOutput* mDLOutput; IDeckLinkKeyer* mDLKeyer; std::deque mDLOutputVideoFrameQueue; PinnedMemoryAllocator* mPlayoutAllocator; BMDTimeValue mFrameDuration; BMDTimeScale mFrameTimescale; unsigned mTotalPlayoutFrames; unsigned mInputFrameWidth; unsigned mInputFrameHeight; unsigned mOutputFrameWidth; unsigned mOutputFrameHeight; std::string mInputDisplayModeName; std::string mOutputDisplayModeName; bool mHasNoInputSource; std::string mDeckLinkOutputModelName; bool mDeckLinkSupportsInternalKeying; bool mDeckLinkSupportsExternalKeying; bool mDeckLinkKeyerInterfaceAvailable; bool mDeckLinkExternalKeyingActive; std::string mDeckLinkStatusMessage; std::unique_ptr mRenderer; std::unique_ptr mRuntimeHost; std::unique_ptr mRenderPass; std::unique_ptr mShaderPrograms; std::unique_ptr mControlServer; std::unique_ptr mOscServer; bool InitOpenGLState(); void renderEffect(); bool PollRuntimeChanges(); void broadcastRuntimeState(); void resetTemporalHistoryState(); }; #endif // __OPENGL_COMPOSITE_H__