From 6a0340d1b428f0fd850768a739a49663e3e2c185 Mon Sep 17 00:00:00 2001 From: Aiden <68633820+awils27@users.noreply.github.com> Date: Wed, 13 May 2026 00:28:11 +1000 Subject: [PATCH] proactive realignment --- .../videoio/decklink/DeckLinkSession.cpp | 22 +++++++++++++++++++ .../videoio/decklink/DeckLinkSession.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.cpp b/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.cpp index 91e022c..1d810d8 100644 --- a/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.cpp +++ b/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.cpp @@ -12,6 +12,9 @@ namespace { +constexpr int64_t kMinimumHealthyScheduleLeadFrames = 3; +constexpr int64_t kProactiveScheduleLeadFloorFrames = 2; + class SystemMemoryDeckLinkVideoBuffer : public IDeckLinkVideoBuffer { public: @@ -539,6 +542,7 @@ bool DeckLinkSession::ScheduleFrame(IDeckLinkMutableVideoFrame* outputVideoFrame } UpdateScheduleLeadTelemetry(); + MaybeRealignScheduleCursorForLowLead(); const VideoIOScheduleTime scheduleTime = mScheduler.NextScheduleTime(); const auto scheduleStart = std::chrono::steady_clock::now(); const HRESULT result = output->ScheduleVideoFrame(outputVideoFrame, scheduleTime.streamTime, scheduleTime.duration, scheduleTime.timeScale); @@ -577,6 +581,24 @@ void DeckLinkSession::UpdateScheduleLeadTelemetry() mState.deckLinkScheduleLeadFrames = static_cast(nextScheduleFrameIndex) - static_cast(playbackFrameIndex); } +void DeckLinkSession::MaybeRealignScheduleCursorForLowLead() +{ + if (!mState.deckLinkScheduleLeadAvailable) + return; + + if (mState.deckLinkScheduleLeadFrames >= kMinimumHealthyScheduleLeadFrames) + { + mProactiveScheduleRealignmentArmed = true; + return; + } + + if (!mProactiveScheduleRealignmentArmed || mState.deckLinkScheduleLeadFrames > kProactiveScheduleLeadFloorFrames) + return; + + RealignScheduleCursorToPlayback(); + mProactiveScheduleRealignmentArmed = false; +} + void DeckLinkSession::RealignScheduleCursorToPlayback() { if (output == nullptr) diff --git a/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.h b/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.h index 21aa215..e1442cc 100644 --- a/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.h +++ b/apps/LoopThroughWithOpenGLCompositing/videoio/decklink/DeckLinkSession.h @@ -76,6 +76,7 @@ private: bool PopulateOutputFrame(IDeckLinkMutableVideoFrame* outputVideoFrame, VideoIOOutputFrame& frame); bool ScheduleFrame(IDeckLinkMutableVideoFrame* outputVideoFrame); void UpdateScheduleLeadTelemetry(); + void MaybeRealignScheduleCursorForLowLead(); void RealignScheduleCursorToPlayback(); bool ScheduleSystemMemoryFrame(const VideoIOOutputFrame& frame); bool ScheduleBlackFrame(IDeckLinkMutableVideoFrame* outputVideoFrame); @@ -95,6 +96,7 @@ private: VideoPlayoutScheduler mScheduler; bool mScheduleRealignmentPending = false; bool mScheduleRealignmentArmed = true; + bool mProactiveScheduleRealignmentArmed = true; InputFrameCallback mInputFrameCallback; OutputFrameCallback mOutputFrameCallback; };