#pragma once #include "DeckLinkDisplayMode.h" #include "DeckLinkSession.h" #include "VideoIOEdges.h" #include "VideoIOTypes.h" #include #include #include #include namespace RenderCadenceCompositor { using DeckLinkOutputConfig = VideoOutputEdgeConfig; using DeckLinkOutputMetrics = VideoOutputEdgeMetrics; class DeckLinkOutput : public IVideoOutputEdge { public: using CompletionCallback = IVideoOutputEdge::CompletionCallback; DeckLinkOutput() = default; DeckLinkOutput(const DeckLinkOutput&) = delete; DeckLinkOutput& operator=(const DeckLinkOutput&) = delete; ~DeckLinkOutput(); bool Initialize(const VideoOutputEdgeConfig& config, CompletionCallback completionCallback, std::string& error) override; bool StartScheduledPlayback(std::string& error) override; bool ScheduleFrame(const VideoIOOutputFrame& frame) override; void Stop() override; void ReleaseResources() override; const VideoIOState& State() const override; DeckLinkOutputMetrics Metrics() const override; private: void HandleCompletion(const VideoIOCompletion& completion); DeckLinkSession mSession; VideoOutputEdgeConfig mConfig; CompletionCallback mCompletionCallback; std::atomic mCompletions{ 0 }; std::atomic mDisplayedLate{ 0 }; std::atomic mDropped{ 0 }; std::atomic mFlushed{ 0 }; }; }