aggregator: Check all pads for data when live

When live, we still need to inspect all pads queue in order to determin
if we have received the first buffer or not.

https://bugzilla.gnome.org/show_bug.cgi?id=765431
This commit is contained in:
Nicolas Dufresne 2016-04-22 10:15:39 -04:00 committed by Tim-Philipp Müller
parent a1e69783e5
commit 834015009f

View file

@ -424,6 +424,7 @@ gst_aggregator_check_pads_ready (GstAggregator * self)
{ {
GstAggregatorPad *pad; GstAggregatorPad *pad;
GList *l, *sinkpads; GList *l, *sinkpads;
gboolean have_data = TRUE;
GST_LOG_OBJECT (self, "checking pads"); GST_LOG_OBJECT (self, "checking pads");
@ -438,22 +439,30 @@ gst_aggregator_check_pads_ready (GstAggregator * self)
PAD_LOCK (pad); PAD_LOCK (pad);
/* In live mode, having a single pad with buffers is enough to if (gst_aggregator_pad_queue_is_empty (pad)) {
* generate a start time from it. In non-live mode all pads need if (!pad->priv->eos) {
* to have a buffer have_data = FALSE;
*/
if (self->priv->peer_latency_live && /* If not live we need data on all pads, so leave the loop */
!gst_aggregator_pad_queue_is_empty (pad)) if (!self->priv->peer_latency_live) {
PAD_UNLOCK (pad);
goto pad_not_ready;
}
}
} else if (self->priv->peer_latency_live) {
/* In live mode, having a single pad with buffers is enough to
* generate a start time from it. In non-live mode all pads need
* to have a buffer
*/
self->priv->first_buffer = FALSE; self->priv->first_buffer = FALSE;
if (gst_aggregator_pad_queue_is_empty (pad) && !pad->priv->eos) {
PAD_UNLOCK (pad);
goto pad_not_ready;
} }
PAD_UNLOCK (pad);
PAD_UNLOCK (pad);
} }
if (!have_data)
goto pad_not_ready;
self->priv->first_buffer = FALSE; self->priv->first_buffer = FALSE;
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);