From f7cc336cac53f92b8942f034db2bcecb74c9394f Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Wed, 5 Oct 2022 10:57:47 +0200 Subject: [PATCH] decklink disp.: implemented timeout --- src/utils/macros.h | 1 + src/video_display/decklink.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/utils/macros.h b/src/utils/macros.h index c503f3a0a..074f04903 100644 --- a/src/utils/macros.h +++ b/src/utils/macros.h @@ -44,6 +44,7 @@ #define IF_NOT_NULL_ELSE(val, default_val) ((val) ? (val) : (default_val)) #define UNDEF -1 #define IF_NOT_UNDEF_ELSE(val, default_val) ((val) != UNDEF ? (val) : (default_val)) +#define DIV_ROUNDED_UP(value, div) ((((value) % (div)) != 0) ? ((value) / (div) + 1) : ((value) / (div))) /** * @brief Creates FourCC word diff --git a/src/video_display/decklink.cpp b/src/video_display/decklink.cpp index a4609cf72..49485b22d 100644 --- a/src/video_display/decklink.cpp +++ b/src/video_display/decklink.cpp @@ -576,7 +576,7 @@ static void update_timecode(DeckLinkTimecode *tc, double fps) tc->SetBCD(bcd); } -static int display_decklink_putf(void *state, struct video_frame *frame, long long flag) +static int display_decklink_putf(void *state, struct video_frame *frame, long long timeout_ns) { struct state_decklink *s = (struct state_decklink *)state; @@ -587,8 +587,9 @@ static int display_decklink_putf(void *state, struct video_frame *frame, long lo uint32_t i; s->state.at(0).deckLinkOutput->GetBufferedVideoFrameCount(&i); - if ((flag == PUTF_NONBLOCK && i > 2) || flag == PUTF_DISCARD) { - if (flag == PUTF_NONBLOCK) { + long long max_frames = DIV_ROUNDED_UP(timeout_ns, (long long)(NS_IN_SEC / frame->fps)); + if (timeout_ns == PUTF_DISCARD || i > max_frames) { + if (timeout_ns != PUTF_DISCARD) { log_msg(LOG_LEVEL_WARNING, MOD_NAME "Frame dropped!\n"); } for (int j = 0; j < s->devices_cnt; ++j) {