#pragma once #include "DeckLinkDisplayMode.h" #include "DeckLinkSession.h" #include "VideoIOTypes.h" #include #include #include #include namespace RenderCadenceCompositor { struct DeckLinkOutputConfig { VideoFormat outputVideoMode; bool externalKeyingEnabled = false; bool outputAlphaRequired = false; }; struct DeckLinkOutputMetrics { uint64_t completions = 0; uint64_t displayedLate = 0; uint64_t dropped = 0; uint64_t flushed = 0; uint64_t scheduleFailures = 0; bool actualBufferedFramesAvailable = false; uint64_t actualBufferedFrames = 0; double scheduleCallMilliseconds = 0.0; bool scheduleLeadAvailable = false; int64_t playbackStreamTime = 0; uint64_t playbackFrameIndex = 0; uint64_t nextScheduleFrameIndex = 0; int64_t scheduleLeadFrames = 0; uint64_t scheduleRealignmentCount = 0; }; class DeckLinkOutput { public: using CompletionCallback = std::function; DeckLinkOutput() = default; DeckLinkOutput(const DeckLinkOutput&) = delete; DeckLinkOutput& operator=(const DeckLinkOutput&) = delete; ~DeckLinkOutput(); bool Initialize(const DeckLinkOutputConfig& config, CompletionCallback completionCallback, std::string& error); bool StartScheduledPlayback(std::string& error); bool ScheduleFrame(const VideoIOOutputFrame& frame); void Stop(); void ReleaseResources(); const VideoIOState& State() const; DeckLinkOutputMetrics Metrics() const; private: void HandleCompletion(const VideoIOCompletion& completion); DeckLinkSession mSession; DeckLinkOutputConfig mConfig; CompletionCallback mCompletionCallback; std::atomic mCompletions{ 0 }; std::atomic mDisplayedLate{ 0 }; std::atomic mDropped{ 0 }; std::atomic mFlushed{ 0 }; }; }