From 400cb786abbe6b06b44416bb155919638739df1f Mon Sep 17 00:00:00 2001 From: Wild Dragon Dev Date: Thu, 4 Jun 2026 00:35:16 +0000 Subject: [PATCH] fix(decklink-bridge): use IDeckLinkVideoBuffer QueryInterface to get raw bytes --- services/capture/decklink-bridge/main.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/services/capture/decklink-bridge/main.cpp b/services/capture/decklink-bridge/main.cpp index 1aa4263..f46cd5d 100644 --- a/services/capture/decklink-bridge/main.cpp +++ b/services/capture/decklink-bridge/main.cpp @@ -268,12 +268,16 @@ public: /* ── Write video frame ──────────────────────────────────────── */ void *bytes = nullptr; - /* Some SDK versions require casting to the base IDeckLinkVideoFrame - * to access GetBytes() from an IDeckLinkVideoInputFrame. */ - IDeckLinkVideoFrame *baseFrame = static_cast(videoFrame); - // SDK has changed: GetBytes() is no longer directly on IDeckLinkVideoFrame. - // Use GetFrameInternalBufferBytes() which is more robust. - videoFrame->GetFrameInternalBufferBytes(&bytes); + + IDeckLinkVideoBuffer *videoBuffer = nullptr; + if (videoFrame->QueryInterface(IID_IDeckLinkVideoBuffer, (void**)&videoBuffer) == S_OK) { + videoBuffer->GetBytes(&bytes); + videoBuffer->Release(); + } else { + fprintf(stderr, "[decklink:%d] ERROR: Failed to get IDeckLinkVideoBuffer interface\n", m_ds->device_idx); + return S_OK; + } + uint32_t sz = (uint32_t)(videoFrame->GetRowBytes() * videoFrame->GetHeight()); uint32_t frame_bytes_expected = (uint32_t)m_ds->width * (uint32_t)m_ds->height * 2;