#pragma once #include "DeckLinkAPI_h.h" #include #include #include #include class DeckLinkSession; class OpenGLRenderer; class RuntimeHost; class OpenGLDeckLinkBridge { public: using RenderEffectCallback = std::function; using PaintCallback = std::function; OpenGLDeckLinkBridge( DeckLinkSession& deckLink, OpenGLRenderer& renderer, RuntimeHost& runtimeHost, CRITICAL_SECTION& mutex, HDC hdc, HGLRC hglrc, RenderEffectCallback renderEffect, PaintCallback paint); void VideoFrameArrived(IDeckLinkVideoInputFrame* inputFrame, bool hasNoInputSource); void PlayoutFrameCompleted(IDeckLinkVideoFrame* completedFrame, BMDOutputFrameCompletionResult completionResult); private: void RecordFramePacing(BMDOutputFrameCompletionResult completionResult); DeckLinkSession& mDeckLink; OpenGLRenderer& mRenderer; RuntimeHost& mRuntimeHost; CRITICAL_SECTION& mMutex; HDC mHdc; HGLRC mHglrc; RenderEffectCallback mRenderEffect; PaintCallback mPaint; std::chrono::steady_clock::time_point mLastPlayoutCompletionTime; double mCompletionIntervalMilliseconds = 0.0; double mSmoothedCompletionIntervalMilliseconds = 0.0; double mMaxCompletionIntervalMilliseconds = 0.0; uint64_t mLateFrameCount = 0; uint64_t mDroppedFrameCount = 0; uint64_t mFlushedFrameCount = 0; };