videoaggregator: support unresponsive pads

Render unresponsive pads with the last video frame received.
This commit is contained in:
Matthew Waters 2014-10-06 18:33:52 +11:00
parent 1e84482f36
commit 9aa89185ed

View file

@ -824,6 +824,8 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
bpad = GST_AGGREGATOR_PAD (pad); bpad = GST_AGGREGATOR_PAD (pad);
segment = &bpad->segment; segment = &bpad->segment;
is_eos = bpad->eos; is_eos = bpad->eos;
if (!is_eos)
eos = FALSE;
buf = gst_aggregator_pad_get_buffer (bpad); buf = gst_aggregator_pad_get_buffer (bpad);
if (buf) { if (buf) {
GstClockTime start_time, end_time; GstClockTime start_time, end_time;
@ -897,7 +899,8 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
end_time *= ABS (agg->segment.rate); end_time *= ABS (agg->segment.rate);
} }
if (pad->end_time != -1 && pad->end_time > end_time) { if (pad->end_time != -1 && pad->end_time > end_time
&& !bpad->unresponsive) {
GST_DEBUG_OBJECT (pad, "Buffer from the past, dropping"); GST_DEBUG_OBJECT (pad, "Buffer from the past, dropping");
gst_buffer_unref (buf); gst_buffer_unref (buf);
buf = gst_aggregator_pad_steal_buffer (bpad); buf = gst_aggregator_pad_steal_buffer (bpad);
@ -939,9 +942,8 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
continue; continue;
} }
} else { } else {
if (pad->end_time != -1) { if (!bpad->unresponsive && pad->end_time != -1) {
if (pad->end_time <= output_start_time) { if (pad->end_time <= output_start_time) {
gst_buffer_replace (&pad->buffer, NULL);
pad->start_time = pad->end_time = -1; pad->start_time = pad->end_time = -1;
if (is_eos) { if (is_eos) {
GST_DEBUG ("I just need more data"); GST_DEBUG ("I just need more data");
@ -950,6 +952,8 @@ gst_videoaggregator_fill_queues (GstVideoAggregator * vagg,
} else if (is_eos) { } else if (is_eos) {
eos = FALSE; eos = FALSE;
} }
} else if (is_eos) {
gst_buffer_replace (&pad->buffer, NULL);
} }
} }
} }