From: Matt via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> To: ffmpeg-devel@ffmpeg.org Cc: matthew@watchgood.com Subject: [FFmpeg-devel] [PATCH] Playout to DeckLink will wait for all buffered frames before stopping. Date: Tue, 8 Jul 2025 11:39:38 +1000 Message-ID: <mailman.5605.1751938799.1384.ffmpeg-devel@ffmpeg.org> (raw) [-- Attachment #1: Type: message/rfc822, Size: 3539 bytes --] From: matthew@watchgood.com To: ffmpeg-devel@ffmpeg.org Cc: Matthew Rademaker <matthew@watchgood.com> Subject: [PATCH] Playout to DeckLink will wait for all buffered frames before stopping. Date: Tue, 8 Jul 2025 11:39:38 +1000 Message-ID: <20250708013949.3044652-1-matthew@watchgood.com> From: Matthew Rademaker <matthew@watchgood.com> Instead of stopping video output to the card as soon as encoding is finished, wait until the card reports that all buffered frames have been played out. Wait longer if there are more frames, shorter if there are fewer so that we end ASAP. See https://ffmpeg.org/pipermail/ffmpeg-devel/2025-March/340634.html Signed-off-by: Matthew Rademaker <matthew@watchgood.com> --- libavdevice/decklink_enc.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp index cb8f91730e..5751f27de8 100644 --- a/libavdevice/decklink_enc.cpp +++ b/libavdevice/decklink_enc.cpp @@ -20,6 +20,7 @@ */ #include <atomic> +#include <unistd.h> using std::atomic; /* Include internal.h first to avoid conflict between winsock.h (used by @@ -369,11 +370,26 @@ av_cold int ff_decklink_write_trailer(AVFormatContext *avctx) { struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data; struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx; + uint32_t buffered; if (ctx->playback_started) { BMDTimeValue actual; ctx->dlo->StopScheduledPlayback(ctx->last_pts * ctx->bmd_tb_num, &actual, ctx->bmd_tb_den); + av_log(avctx, AV_LOG_DEBUG, "Stopped at %ld, requested %ld\n", actual, ctx->last_pts * ctx->bmd_tb_num); + while (1){ + ctx->dlo->GetBufferedVideoFrameCount(&buffered); + if (buffered <= 0){ + break; + } + av_log(avctx, AV_LOG_DEBUG, "Waiting for %d buffered frames to finish\n", buffered); + if (buffered < 5) { + usleep(1); + } else { + usleep(300); + } + } + av_log(avctx, AV_LOG_DEBUG, "All frames returned, finishing up\n"); ctx->dlo->DisableVideoOutput(); if (ctx->audio) ctx->dlo->DisableAudioOutput(); -- 2.43.0 [-- Attachment #2: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
reply other threads:[~2025-07-08 1:40 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=mailman.5605.1751938799.1384.ffmpeg-devel@ffmpeg.org \ --to=ffmpeg-devel@ffmpeg.org \ --cc=matthew@watchgood.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git