diff options
author | Edward Hervey <edward@centricular.com> | 2021-02-26 11:39:10 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-02-26 14:27:40 +0000 |
commit | 9622a2b28047416acfa04fe47f3b1cb5b11f1f5f (patch) | |
tree | 53d0555607d478591cb661ace622c8ed3ae5ca78 | |
parent | f086e6d61ec99fda012fca97a8a655956d8fd00c (diff) | |
download | gstreamer-plugins-bad-9622a2b28047416acfa04fe47f3b1cb5b11f1f5f.tar.gz |
decklinksrc: Use a more accurate capture time
Use the hardware reference clock time when the frame was finished being captured
instead of a time much further down the road.
This improves the stability/accuracy of buffer times.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2041>
-rw-r--r-- | sys/decklink/gstdecklink.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index 267d51878..9fe7196ff 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -1023,6 +1023,41 @@ public: if (clock) { capture_time = gst_clock_get_time (clock); + if (video_frame) { + // If we have the actual capture time for the frame, compensate the + // capture time accordingly. + // + // We do this by subtracting the belay between "now" in hardware + // reference clock and the time when the frame was finished being + // capture based on the same hardware reference clock. + // + // We then subtract that difference from the "now" on the gst clock. + // + // *Technically* we should be compensating that difference for the + // difference in clock rate between the "hardware reference clock" and + // the GStreamer clock. But since the values are quite small this has + // very little impact. + BMDTimeValue hardware_now; + res = m_input->input->GetHardwareReferenceClock (GST_SECOND, &hardware_now, NULL, NULL); + if (res == S_OK) { + res = + video_frame->GetHardwareReferenceTimestamp (GST_SECOND, + &hardware_time, &hardware_duration); + if (res != S_OK) { + GST_ERROR ("Failed to get hardware time: 0x%08lx", (unsigned long) res); + hardware_time = GST_CLOCK_TIME_NONE; + hardware_duration = GST_CLOCK_TIME_NONE; + } else { + GstClockTime hardware_diff = hardware_now - hardware_time; + GST_LOG ("Compensating capture time by %" GST_TIME_FORMAT, + GST_TIME_ARGS (hardware_diff)); + if (capture_time > hardware_diff) + capture_time -= hardware_diff; + else + capture_time = 0; + } + } + } if (capture_time > base_time) capture_time -= base_time; else |