From 8936a692c13cc7c7a6b77892729d8004ac96b3df Mon Sep 17 00:00:00 2001 From: =?utf8?q?Olivier=20Cr=C3=AAte?= Date: Sun, 15 May 2016 16:04:58 +0300 Subject: [PATCH] aggregator: Only declare first buffer on actual buffer The function needs to be unlocked if any data is received, but only end the first buffer processing on an actual buffer, synchronized events don't matter on the first buffer processing. https://bugzilla.gnome.org/show_bug.cgi?id=781673 --- libs/gst/base/gstaggregator.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/libs/gst/base/gstaggregator.c b/libs/gst/base/gstaggregator.c index cd146fd..88b71bc 100644 --- a/libs/gst/base/gstaggregator.c +++ b/libs/gst/base/gstaggregator.c @@ -426,7 +426,8 @@ gst_aggregator_check_pads_ready (GstAggregator * self) { GstAggregatorPad *pad; GList *l, *sinkpads; - gboolean have_data = TRUE; + gboolean have_buffer = TRUE; + gboolean have_event = FALSE; GST_LOG_OBJECT (self, "checking pads"); @@ -441,9 +442,11 @@ gst_aggregator_check_pads_ready (GstAggregator * self) PAD_LOCK (pad); - if (gst_aggregator_pad_queue_is_empty (pad)) { + if (pad->priv->num_buffers == 0) { + if (!gst_aggregator_pad_queue_is_empty (pad)) + have_event = TRUE; if (!pad->priv->eos) { - have_data = FALSE; + have_buffer = FALSE; /* If not live we need data on all pads, so leave the loop */ if (!self->priv->peer_latency_live) { @@ -462,10 +465,11 @@ gst_aggregator_check_pads_ready (GstAggregator * self) PAD_UNLOCK (pad); } - if (!have_data) + if (!have_buffer && !have_event) goto pad_not_ready; - self->priv->first_buffer = FALSE; + if (have_buffer) + self->priv->first_buffer = FALSE; GST_OBJECT_UNLOCK (self); GST_LOG_OBJECT (self, "pads are ready"); @@ -479,9 +483,13 @@ no_sinkpads: } pad_not_ready: { - GST_LOG_OBJECT (pad, "pad not ready to be aggregated yet"); + if (have_event) + GST_LOG_OBJECT (pad, "pad not ready to be aggregated yet," + " but waking up for serialized event"); + else + GST_LOG_OBJECT (pad, "pad not ready to be aggregated yet"); GST_OBJECT_UNLOCK (self); - return FALSE; + return have_event; } } -- 2.7.4