summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2017-12-28 12:15:21 +0100
committerMathieu Duponchelle <mathieu@centricular.com>2018-01-23 20:19:38 +0100
commit99f646b0096469929fde6b4200d79841988a8732 (patch)
tree77539096ccc65af06a9a68ccc77c5c382456614e /gst-libs
parent2a40ab6ad660c37b22e82991696d0c40e70da79b (diff)
downloadgstreamer-plugins-bad-99f646b0096469929fde6b4200d79841988a8732.tar.gz
videoaggregatorpad: implement skip_buffer
Skip buffers from sources with a framerate higher than the output framerate. https://bugzilla.gnome.org/show_bug.cgi?id=781928
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/video/gstvideoaggregator.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c
index a0c23b746..6c043782b 100644
--- a/gst-libs/gst/video/gstvideoaggregator.c
+++ b/gst-libs/gst/video/gstvideoaggregator.c
@@ -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);