From 0355bb7c348fd57930477a03da56a66b42bd0074 Mon Sep 17 00:00:00 2001 From: Vivia Nikolaidou Date: Tue, 10 Oct 2017 18:03:15 +0300 Subject: [PATCH] decklink: Print one "dropped N old frames" message, not one per frame If we drop many frames at once, printing one message per video frame and one per audio packet would cause a lot of disk IO. Just print a total at the end. https://bugzilla.gnome.org/show_bug.cgi?id=788780 --- sys/decklink/gstdecklinkaudiosrc.cpp | 15 +++++++++++++-- sys/decklink/gstdecklinkvideosrc.cpp | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp index 2b63036ab4..a9144281d3 100644 --- a/sys/decklink/gstdecklinkaudiosrc.cpp +++ b/sys/decklink/gstdecklinkaudiosrc.cpp @@ -526,16 +526,27 @@ gst_decklink_audio_src_got_packet (GstElement * element, g_mutex_lock (&self->lock); if (!self->flushing) { CapturePacket p; + guint skipped_packets = 0; + GstClockTime from_timestamp = GST_CLOCK_TIME_NONE; + GstClockTime to_timestamp = GST_CLOCK_TIME_NONE; while (gst_queue_array_get_length (self->current_packets) >= self->buffer_size) { CapturePacket *tmp = (CapturePacket *) gst_queue_array_pop_head_struct (self->current_packets); - GST_WARNING_OBJECT (self, "Dropping old packet at %" GST_TIME_FORMAT, - GST_TIME_ARGS (tmp->timestamp)); + if (skipped_packets == 0) + from_timestamp = tmp->timestamp; + skipped_packets++; + to_timestamp = tmp->timestamp; capture_packet_clear (tmp); } + if (skipped_packets > 0) + GST_WARNING_OBJECT (self, + "Dropped %u old packets from %" GST_TIME_FORMAT " to %" + GST_TIME_FORMAT, skipped_packets, GST_TIME_ARGS (from_timestamp), + GST_TIME_ARGS (to_timestamp)); + memset (&p, 0, sizeof (p)); p.packet = packet; p.timestamp = timestamp; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index 5486d191ce..5a630e9fd4 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -679,16 +679,27 @@ gst_decklink_video_src_got_frame (GstElement * element, const GstDecklinkMode *bmode; GstVideoTimeCodeFlags flags = GST_VIDEO_TIME_CODE_FLAGS_NONE; guint field_count = 0; + guint skipped_frames = 0; + GstClockTime from_timestamp = GST_CLOCK_TIME_NONE; + GstClockTime to_timestamp = GST_CLOCK_TIME_NONE; while (gst_queue_array_get_length (self->current_frames) >= self->buffer_size) { CaptureFrame *tmp = (CaptureFrame *) gst_queue_array_pop_head_struct (self->current_frames); - GST_WARNING_OBJECT (self, "Dropping old frame at %" GST_TIME_FORMAT, - GST_TIME_ARGS (tmp->timestamp)); + if (skipped_frames == 0) + from_timestamp = tmp->timestamp; + skipped_frames++; + to_timestamp = tmp->timestamp; capture_frame_clear (tmp); } + if (skipped_frames > 0) + GST_WARNING_OBJECT (self, + "Dropped %u old frames from %" GST_TIME_FORMAT " to %" + GST_TIME_FORMAT, skipped_frames, GST_TIME_ARGS (from_timestamp), + GST_TIME_ARGS (to_timestamp)); + memset (&f, 0, sizeof (f)); f.frame = frame; f.timestamp = timestamp;