On Wed, 13 Nov 2019, Gyan wrote:
As suggested in the review of an earlier patch*, this one drops frames till a TC is seen.
From 05555932db9d14dea215c1b0e5dcac4eac16cd6a Mon Sep 17 00:00:00 2001 From: Gyan Doshi <ffm...@gyani.pro> Date: Mon, 9 Sep 2019 18:33:09 +0530 Subject: [PATCH] avdevice/decklink: add option to drop frames till timecode is seen Option wait_for_tc only takes effect if tc_format is set --- libavdevice/decklink_common.h | 1 + libavdevice/decklink_common_c.h | 1 + libavdevice/decklink_dec.cpp | 12 ++++++++++++ libavdevice/decklink_dec_c.c | 1 + 4 files changed, 15 insertions(+)
Docs update is missing for the new option as well as micro version bump.
diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h index 921818ba41..35422a300b 100644 --- a/libavdevice/decklink_common.h +++ b/libavdevice/decklink_common.h @@ -149,6 +149,7 @@ struct decklink_ctx { int channels; int audio_depth; + unsigned long tc_seen; // used with option wait_for_tc }; typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t; diff --git a/libavdevice/decklink_common_c.h b/libavdevice/decklink_common_c.h index ca85ec2504..b78630b5fc 100644 --- a/libavdevice/decklink_common_c.h +++ b/libavdevice/decklink_common_c.h @@ -58,6 +58,7 @@ struct decklink_cctx { int copyts; int64_t timestamp_align; int timing_offset; + int wait_for_tc; }; #endif /* AVDEVICE_DECKLINK_COMMON_C_H */ diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 4da9122bff..69be37ed64 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -784,6 +784,8 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( if (packed_metadata) { if (av_packet_add_side_data(&pkt, AV_PKT_DATA_STRINGS_METADATA, packed_metadata, metadata_len) < 0) av_freep(&packed_metadata); + else if (!ctx->tc_seen) + ctx->tc_seen = ctx->frameCount; } } } @@ -793,6 +795,14 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( } } + if (ctx->tc_format && cctx->wait_for_tc && !ctx->tc_seen) { + + av_log(avctx, AV_LOG_WARNING, "No TC detected yet. wait_for_tc set. Dropping. \n"); + av_log(avctx, AV_LOG_WARNING, "Frame received (#%lu) - " + "- Frames dropped %u\n", ctx->frameCount, ++ctx->dropped); + return S_OK; + } + pkt.pts = get_pkt_pts(videoFrame, audioFrame, wallclock, abs_wallclock, ctx->video_pts_source, ctx->video_st->time_base, &initial_video_pts, cctx->copyts); pkt.dts = pkt.pts; @@ -880,6 +890,8 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( videoFrame->AddRef(); if (avpacket_queue_put(&ctx->queue, &pkt) < 0) { + if (ctx->tc_seen == ctx->frameCount) + ctx->tc_seen = 0;
I don't think this is needed, this can only happen in an ENOMEM case. Keep it if you feel strongly about it, but it looks a rather useless corner case to me.
LGTM if docs is added. Thanks, Marton _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".