#pragma once #include "DeckLinkAPI_h.h" #include "DeckLinkDisplayMode.h" #include "DeckLinkFrameTransfer.h" #include #include #include class OpenGLComposite; class DeckLinkSession { public: DeckLinkSession() = default; ~DeckLinkSession(); void ReleaseResources(); bool DiscoverDevicesAndModes(const VideoFormatSelection& videoModes, std::string& error); bool ConfigureInput(OpenGLComposite* owner, HDC hdc, HGLRC hglrc, const VideoFormat& inputVideoMode, std::string& error); bool ConfigureOutput(OpenGLComposite* owner, HDC hdc, HGLRC hglrc, const VideoFormat& outputVideoMode, bool externalKeyingEnabled, std::string& error); bool Start(); bool Stop(); bool HasInputDevice() const { return input != nullptr; } bool HasInputSource() const { return !hasNoInputSource; } void SetInputSourceMissing(bool missing) { hasNoInputSource = missing; } bool InputOutputDimensionsDiffer() const { return inputFrameSize != outputFrameSize; } const FrameSize& InputFrameSize() const { return inputFrameSize; } const FrameSize& OutputFrameSize() const { return outputFrameSize; } unsigned InputFrameWidth() const { return inputFrameSize.width; } unsigned InputFrameHeight() const { return inputFrameSize.height; } unsigned OutputFrameWidth() const { return outputFrameSize.width; } unsigned OutputFrameHeight() const { return outputFrameSize.height; } const std::string& InputDisplayModeName() const { return inputDisplayModeName; } const std::string& OutputModelName() const { return outputModelName; } bool SupportsInternalKeying() const { return supportsInternalKeying; } bool SupportsExternalKeying() const { return supportsExternalKeying; } bool KeyerInterfaceAvailable() const { return keyerInterfaceAvailable; } bool ExternalKeyingActive() const { return externalKeyingActive; } const std::string& StatusMessage() const { return statusMessage; } void SetStatusMessage(const std::string& message) { statusMessage = message; } double FrameBudgetMilliseconds() const; IDeckLinkMutableVideoFrame* RotateOutputFrame(); bool TransferPlayoutFrame(void* address, GLuint outputTexture); void WaitForPlayoutTransferComplete(void* address); void AccountForCompletionResult(BMDOutputFrameCompletionResult completionResult); bool ScheduleOutputFrame(IDeckLinkMutableVideoFrame* outputVideoFrame); private: CComPtr captureDelegate; CComPtr playoutDelegate; CComPtr input; CComPtr output; CComPtr keyer; std::deque> outputVideoFrameQueue; CComPtr playoutAllocator; BMDTimeValue frameDuration = 0; BMDTimeScale frameTimescale = 0; unsigned totalPlayoutFrames = 0; FrameSize inputFrameSize; FrameSize outputFrameSize; std::string inputDisplayModeName = "1080p59.94"; std::string outputDisplayModeName = "1080p59.94"; bool hasNoInputSource = true; std::string outputModelName; bool supportsInternalKeying = false; bool supportsExternalKeying = false; bool keyerInterfaceAvailable = false; bool externalKeyingActive = false; std::string statusMessage; };