From patchwork Fri Nov 15 06:47:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Gyan Doshi X-Patchwork-Id: 16277 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5B34B449E1D for ; Fri, 15 Nov 2019 08:47:45 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4397968A141; Fri, 15 Nov 2019 08:47:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout-p-101.mailbox.org (mout-p-101.mailbox.org [80.241.56.151]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 159F1689A28 for ; Fri, 15 Nov 2019 08:47:39 +0200 (EET) Received: from smtp2.mailbox.org (smtp2.mailbox.org [80.241.60.241]) (using TLSv1.2 with cipher ECDHE-RSA-CHACHA20-POLY1305 (256/256 bits)) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 47DpnQ4FtXzKmP8 for ; Fri, 15 Nov 2019 07:47:38 +0100 (CET) X-Virus-Scanned: amavisd-new at heinlein-support.de Received: from smtp2.mailbox.org ([80.241.60.241]) by spamfilter03.heinlein-hosting.de (spamfilter03.heinlein-hosting.de [80.241.56.117]) (amavisd-new, port 10030) with ESMTP id jjyodqIMSFoM for ; Fri, 15 Nov 2019 07:47:35 +0100 (CET) To: ffmpeg-devel@ffmpeg.org References: <8844fbc9-a92b-aa79-38eb-a012da7288d5@gyani.pro> From: Gyan Message-ID: Date: Fri, 15 Nov 2019 12:17:31 +0530 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Subject: Re: [FFmpeg-devel] [PATCH] avdevice/decklink: add option to drop frames till timecode is seen X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" On 15-11-2019 03:23 am, Marton Balint wrote: > > > 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 >> 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. Added. > >> >> 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. Removed. > > LGTM if docs is added. Revised patch attached. Thanks, Gyan From d76ed7ec1582a2050c9cfc755c243da22bb3c41a Mon Sep 17 00:00:00 2001 From: Gyan Doshi 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}. +@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. +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, \