[FFmpeg-devel] [PATCH] avdevice/decklink: add option to drop frames till timecode is seen
Marton Balint
cus at passwd.hu
Sun Nov 17 18:30:27 EET 2019
> From: Gyan Doshi <ffmpeg at gyani.pro>
> Date: Mon, 9 Sep 2019 18:33:09 +0530
> Subject: [PATCH v2] avdevice/decklink: add option to drop frames till timecode
> is seen
>
> Option wait_for_tc only takes effect if tc_format is set
> ---
> doc/indevs.texi | 8 ++++++++
> libavdevice/decklink_common.h | 1 +
> libavdevice/decklink_common_c.h | 1 +
> libavdevice/decklink_dec.cpp | 10 ++++++++++
> libavdevice/decklink_dec_c.c | 1 +
> libavdevice/version.h | 2 +-
> 6 files changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/doc/indevs.texi b/doc/indevs.texi
> index 14595774f3..bc791013f2 100644
> --- a/doc/indevs.texi
> +++ b/doc/indevs.texi
> @@ -395,6 +395,14 @@ Either sync could go wrong by 1 frame or in a rarer case
> @option{timestamp_align} seconds.
> Defaults to @samp{0}.
>
> + at item wait_for_tc (@emph{bool})
> +Drop frames till a frame with timecode is received. Sometimes serial timecode
> +isn't received with the first input frame. If that happens, the stored stream
> +timecode will be inaccurate. If this option is set to @option{true}, input frames
> +are dropped till a frame with timecode is received.
> +Option @var{timecode_format} must have been set.
I don't think "must have been" is correct here. Maybe simply write this:
Option @var{timecode_format} must also be specified.
> +Defaults to @option{false}.
> +
> @end table
>
> @subsection Examples
> 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..ab7f28112e 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;
>
> diff --git a/libavdevice/decklink_dec_c.c b/libavdevice/decklink_dec_c.c
> index 7aceaf934c..99439f91ae 100644
> --- a/libavdevice/decklink_dec_c.c
> +++ b/libavdevice/decklink_dec_c.c
> @@ -85,6 +85,7 @@ static const AVOption options[] = {
> { "audio_depth", "audio bitdepth (16 or 32)", OFFSET(audio_depth), AV_OPT_TYPE_INT, { .i64 = 16}, 16, 32, DEC },
> { "decklink_copyts", "copy timestamps, do not remove the initial offset", OFFSET(copyts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, DEC },
> { "timestamp_align", "capture start time alignment (in seconds)", OFFSET(timestamp_align), AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT_MAX, DEC },
> + { "wait_for_tc", "drop frames till a frame with timecode is received. TC format must be set", OFFSET(wait_for_tc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, DEC },
> { NULL },
> };
>
> diff --git a/libavdevice/version.h b/libavdevice/version.h
> index e3a583d267..68302908cf 100644
> --- a/libavdevice/version.h
> +++ b/libavdevice/version.h
> @@ -29,7 +29,7 @@
>
> #define LIBAVDEVICE_VERSION_MAJOR 58
> #define LIBAVDEVICE_VERSION_MINOR 9
> -#define LIBAVDEVICE_VERSION_MICRO 100
> +#define LIBAVDEVICE_VERSION_MICRO 101
>
> #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
> LIBAVDEVICE_VERSION_MINOR, \
> --
> 2.24.0
Otherwise LGTM.
Thanks,
Marton
More information about the ffmpeg-devel
mailing list