From: Vivia Nikolaidou Date: Tue, 7 Nov 2017 19:13:57 +0000 (+0200) Subject: WIP: Revert "Revert "decklink: Detect gaps on incoming stream times, issue warnings"" X-Git-Tag: 1.19.3~507^2~4578 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8dceeb5ccd6e46a61e3bbe79efa45275504fa500;p=platform%2Fupstream%2Fgstreamer.git WIP: Revert "Revert "decklink: Detect gaps on incoming stream times, issue warnings"" This reverts commit 07819afda461f5e4d77c9be9f484a7aae3c5ec8c. --- diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp index a9b5036..10fb1ed 100644 --- a/sys/decklink/gstdecklinkaudiosrc.cpp +++ b/sys/decklink/gstdecklinkaudiosrc.cpp @@ -36,6 +36,10 @@ GST_DEBUG_CATEGORY_STATIC (gst_decklink_audio_src_debug); #define DEFAULT_DISCONT_WAIT (1 * GST_SECOND) #define DEFAULT_CHANNELS (GST_DECKLINK_AUDIO_CHANNELS_2) +#ifndef ABSDIFF +#define ABSDIFF(x, y) ( (x) > (y) ? ((x) - (y)) : ((y) - (x)) ) +#endif + enum { PROP_0, @@ -701,6 +705,44 @@ retry: self->info.rate) - timestamp; } + // Detect gaps in stream time + self->processed += sample_count; + + if (p.stream_timestamp != GST_CLOCK_TIME_NONE) { + GstClockTime start_stream_time, end_stream_time; + + start_stream_time = p.stream_timestamp; + + start_offset = + gst_util_uint64_scale (start_stream_time, self->info.rate, GST_SECOND); + + end_offset = start_offset + sample_count; + end_stream_time = gst_util_uint64_scale_int (end_offset, GST_SECOND, + self->info.rate); + + if (self->expected_stream_time != GST_CLOCK_TIME_NONE && + ABSDIFF (self->expected_stream_time, p.stream_timestamp) > + gst_util_uint64_scale (2, GST_SECOND, self->info.rate)) { + GstMessage *msg; + GstClockTime running_time; + + self->dropped += + gst_util_uint64_scale (ABSDIFF (self->expected_stream_time, + p.stream_timestamp), self->info.rate, GST_SECOND); + running_time = + gst_segment_to_running_time (&GST_BASE_SRC (self)->segment, + GST_FORMAT_TIME, timestamp); + + msg = + gst_message_new_qos (GST_OBJECT (self), TRUE, running_time, p.stream_timestamp, + timestamp, duration); + gst_message_set_qos_stats (msg, GST_FORMAT_DEFAULT, self->processed, + self->dropped); + gst_element_post_message (GST_ELEMENT (self), msg); + } + self->expected_stream_time = end_stream_time; + } + if (p.no_signal) GST_BUFFER_FLAG_SET (*buffer, GST_BUFFER_FLAG_GAP); GST_BUFFER_TIMESTAMP (*buffer) = timestamp; @@ -907,6 +949,9 @@ gst_decklink_audio_src_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: + self->processed = 0; + self->dropped = 0; + self->expected_stream_time = GST_CLOCK_TIME_NONE; if (!gst_decklink_audio_src_open (self)) { ret = GST_STATE_CHANGE_FAILURE; goto out; diff --git a/sys/decklink/gstdecklinkaudiosrc.h b/sys/decklink/gstdecklinkaudiosrc.h index 64cde67..c631d39 100644 --- a/sys/decklink/gstdecklinkaudiosrc.h +++ b/sys/decklink/gstdecklinkaudiosrc.h @@ -71,6 +71,11 @@ struct _GstDecklinkAudioSrc /* counter to keep track of timestamps */ guint64 next_offset; + /* detect gaps in stream time */ + GstClockTime expected_stream_time; + guint64 processed; + guint64 dropped; + /* Last time we noticed a discont */ GstClockTime discont_time; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index c47c8ee..b4daa85 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -36,6 +36,10 @@ GST_DEBUG_CATEGORY_STATIC (gst_decklink_video_src_debug); #define DEFAULT_SKIP_FIRST_TIME (0) #define DEFAULT_DROP_NO_SIGNAL_FRAMES (FALSE) +#ifndef ABSDIFF +#define ABSDIFF(x, y) ( (x) > (y) ? ((x) - (y)) : ((y) - (x)) ) +#endif + enum { PROP_0, @@ -825,6 +829,26 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) } } + if (self->expected_stream_time != GST_CLOCK_TIME_NONE && + ABSDIFF (self->expected_stream_time, f.stream_timestamp) > 1) { + GstMessage *msg; + GstClockTime running_time; + + self->dropped += f.stream_timestamp - self->expected_stream_time; + running_time = gst_segment_to_running_time (&GST_BASE_SRC (self)->segment, + GST_FORMAT_TIME, f.timestamp); + + msg = gst_message_new_qos (GST_OBJECT (self), TRUE, running_time, f.stream_timestamp, + f.timestamp, f.duration); + gst_message_set_qos_stats (msg, GST_FORMAT_TIME, self->processed, + self->dropped); + gst_element_post_message (GST_ELEMENT (self), msg); + } + if (self->first_stream_time == GST_CLOCK_TIME_NONE) + self->first_stream_time = f.stream_timestamp; + self->processed = f.stream_timestamp - self->dropped - self->first_stream_time; + self->expected_stream_time = f.stream_timestamp + f.stream_duration; + g_mutex_unlock (&self->lock); if (caps_changed) { caps = gst_decklink_mode_get_caps (f.mode, f.format, TRUE); @@ -1080,6 +1104,10 @@ gst_decklink_video_src_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: + self->processed = 0; + self->dropped = 0; + self->expected_stream_time = GST_CLOCK_TIME_NONE; + self->first_stream_time = GST_CLOCK_TIME_NONE; if (!gst_decklink_video_src_open (self)) { ret = GST_STATE_CHANGE_FAILURE; goto out; diff --git a/sys/decklink/gstdecklinkvideosrc.h b/sys/decklink/gstdecklinkvideosrc.h index c171065..49c5ba8 100644 --- a/sys/decklink/gstdecklinkvideosrc.h +++ b/sys/decklink/gstdecklinkvideosrc.h @@ -58,6 +58,10 @@ struct _GstDecklinkVideoSrc gboolean output_stream_time; GstClockTime skip_first_time; gboolean drop_no_signal_frames; + GstClockTime expected_stream_time; + guint64 processed; + guint64 dropped; + guint64 first_stream_time; GstVideoInfo info; GstDecklinkVideoFormat video_format;