]> git.sesse.net Git - ffmpeg/commitdiff
avdevice/decklink_dec: add option to align capture start time
authorKarthick Jeyapal <kjeyapal@akamai.com>
Fri, 28 Sep 2018 07:25:54 +0000 (12:55 +0530)
committerMarton Balint <cus@passwd.hu>
Sun, 30 Sep 2018 19:09:12 +0000 (21:09 +0200)
This option is useful for maintaining input synchronization across N
different hardware devices deployed for 'N-way' redundancy.
The system time of different hardware devices should be synchronized
with protocols such as NTP or PTP, before using this option.

Signed-off-by: Marton Balint <cus@passwd.hu>
doc/indevs.texi
libavdevice/decklink_common_c.h
libavdevice/decklink_dec.cpp
libavdevice/decklink_dec_c.c
libavdevice/version.h

index ed2784be9f1d05d1633f17b9f4ec7e3e3d879b0e..9a9cb697d35f8a5c0394946a7a8e15e55745bd6d 100644 (file)
@@ -371,6 +371,20 @@ If set to @option{true}, timestamps are forwarded as they are without removing
 the initial offset.
 Defaults to @option{false}.
 
+@item timestamp_align
+Capture start time alignment in seconds. If set to nonzero, input frames are
+dropped till the system timestamp aligns with configured value.
+Alignment difference of upto one frame duration is tolerated.
+This is useful for maintaining input synchronization across N different
+hardware devices deployed for 'N-way' redundancy. The system time of different
+hardware devices should be synchronized with protocols such as NTP or PTP,
+before using this option.
+Note that this method is not foolproof. In some border cases input
+synchronization may not happen due to thread scheduling jitters in the OS.
+Either sync could go wrong by 1 frame or in a rarer case
+@option{timestamp_align} seconds.
+Defaults to @samp{0}.
+
 @end table
 
 @subsection Examples
index 32a5d70ee1981b933199f45af082faa82915ca44..8e3bbeb7df79ce1044f5b80e81f0c15785ef265c 100644 (file)
@@ -56,6 +56,7 @@ struct decklink_cctx {
     int raw_format;
     int64_t queue_size;
     int copyts;
+    int64_t timestamp_align;
 };
 
 #endif /* AVDEVICE_DECKLINK_COMMON_C_H */
index 7fabef231c71fe16231afc75101382bc8d4f99c9..deb8f787ee66cb5e8f0535c9acb43a6e0d76e193 100644 (file)
@@ -703,6 +703,16 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
         return S_OK;
     }
 
+    // Drop the frames till system's timestamp aligns with the configured value.
+    if (0 == ctx->frameCount && cctx->timestamp_align) {
+        AVRational remainder = av_make_q(av_gettime() % cctx->timestamp_align, 1000000);
+        AVRational frame_duration = av_inv_q(ctx->video_st->r_frame_rate);
+        if (av_cmp_q(remainder, frame_duration) > 0) {
+            ++ctx->dropped;
+            return S_OK;
+        }
+    }
+
     ctx->frameCount++;
     if (ctx->audio_pts_source == PTS_SRC_WALLCLOCK || ctx->video_pts_source == PTS_SRC_WALLCLOCK)
         wallclock = av_gettime_relative();
index 6ab3819375b278ce6a2f07b307d5f7952630aeb5..91d2839c57e5e09d6fbaa1009943f6b4a45116aa 100644 (file)
@@ -84,6 +84,7 @@ static const AVOption options[] = {
     { "queue_size",    "input queue buffer size",   OFFSET(queue_size),   AV_OPT_TYPE_INT64, { .i64 = (1024 * 1024 * 1024)}, 0, INT64_MAX, DEC },
     { "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 },
     { NULL },
 };
 
index 8c96e606c2756935a18318f0ed675c69dedefbdf..e6ee009cc45545760d0e099f8812c37988ce85df 100644 (file)
@@ -29,7 +29,7 @@
 
 #define LIBAVDEVICE_VERSION_MAJOR  58
 #define LIBAVDEVICE_VERSION_MINOR   4
-#define LIBAVDEVICE_VERSION_MICRO 104
+#define LIBAVDEVICE_VERSION_MICRO 105
 
 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
                                                LIBAVDEVICE_VERSION_MINOR, \