From b4ee792fc2f9911c5ae85565deab03af490e38af Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Mon, 9 Feb 2015 00:59:30 +1100 Subject: [PATCH] videoaggregator: fix buffer selection when duration=-1 If the src framerate and videoaggreator's output framerate were different, then we were taking every single buffer that had duration=-1 as it came in regardless of the buffer's start time. This caused the src to possibly run at a different speed to the output frames. https://bugzilla.gnome.org/show_bug.cgi?id=744096 --- gst-libs/gst/video/gstvideoaggregator.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c index db413ca3f9..bd6eb32c50 100644 --- a/gst-libs/gst/video/gstvideoaggregator.c +++ b/gst-libs/gst/video/gstvideoaggregator.c @@ -1000,6 +1000,25 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg, end_time = GST_BUFFER_DURATION (buf); if (end_time == -1) { + start_time = MAX (start_time, segment.start); + start_time = + gst_segment_to_running_time (&segment, GST_FORMAT_TIME, start_time); + + if (start_time >= output_end_time) { + GST_DEBUG_OBJECT (pad, "buffer duration is -1, start_time >= " + "output_end_time. Keeping previous buffer"); + gst_buffer_unref (buf); + continue; + } else if (start_time < output_start_time) { + GST_DEBUG_OBJECT (pad, "buffer duration is -1, start_time < " + "output_start_time. Discarding old buffer"); + gst_buffer_replace (&pad->buffer, buf); + gst_buffer_unref (buf); + buf = gst_aggregator_pad_steal_buffer (bpad); + gst_buffer_unref (buf); + need_more_data = TRUE; + continue; + } gst_buffer_unref (buf); buf = gst_aggregator_pad_steal_buffer (bpad); gst_buffer_replace (&pad->buffer, buf);