videoaggregatorpad: implement skip_buffer
authorMathieu Duponchelle <mathieu@centricular.com>
Thu, 28 Dec 2017 11:15:21 +0000 (12:15 +0100)
committerMathieu Duponchelle <mathieu@centricular.com>
Tue, 23 Jan 2018 19:19:38 +0000 (20:19 +0100)
Skip buffers from sources with a framerate higher than the output
framerate.

https://bugzilla.gnome.org/show_bug.cgi?id=781928

gst-libs/gst/video/gstvideoaggregator.c

index a0c23b7..6c04378 100644 (file)
@@ -219,6 +219,28 @@ gst_video_aggregator_pad_set_info (GstVideoAggregatorPad * pad,
   return TRUE;
 }
 
+static gboolean
+gst_video_aggregator_pad_skip_buffer (GstAggregatorPad * aggpad,
+    GstAggregator * agg, GstBuffer * buffer)
+{
+  gboolean ret = FALSE;
+
+  if (agg->segment.position != GST_CLOCK_TIME_NONE
+      && GST_BUFFER_DURATION (buffer) != GST_CLOCK_TIME_NONE) {
+    GstClockTime start_time =
+        gst_segment_to_running_time (&aggpad->segment, GST_FORMAT_TIME,
+        GST_BUFFER_PTS (buffer));
+    GstClockTime end_time = start_time + GST_BUFFER_DURATION (buffer);
+    GstClockTime output_start_running_time =
+        gst_segment_to_running_time (&agg->segment, GST_FORMAT_TIME,
+        agg->segment.position);
+
+    ret = end_time < output_start_running_time;
+  }
+
+  return ret;
+}
+
 static void
 gst_video_aggregator_pad_finalize (GObject * o)
 {
@@ -324,6 +346,8 @@ gst_video_aggregator_pad_class_init (GstVideoAggregatorPadClass * klass)
   g_type_class_add_private (klass, sizeof (GstVideoAggregatorPadPrivate));
 
   aggpadclass->flush = GST_DEBUG_FUNCPTR (_flush_pad);
+  aggpadclass->skip_buffer =
+      GST_DEBUG_FUNCPTR (gst_video_aggregator_pad_skip_buffer);
   klass->set_info = GST_DEBUG_FUNCPTR (gst_video_aggregator_pad_set_info);
   klass->prepare_frame =
       GST_DEBUG_FUNCPTR (gst_video_aggregator_pad_prepare_frame);