mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 02:31:03 +00:00
aggregator: check if pads are ready more efficiently
No need to use an iterator for this which creates a temporary structure every time and also involves taking and releasing the object lock many times in the course of iterating. Not to mention all that GList handling in gst_aggregator_iterate_sinkpads().
This commit is contained in:
parent
3e38003218
commit
4da01dadcc
1 changed files with 36 additions and 14 deletions
|
@ -349,18 +349,44 @@ no_iter:
|
|||
return result;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
gst_aggregator_check_all_pads_with_data_or_eos (GstAggregator * self,
|
||||
GstAggregatorPad * aggpad, gpointer user_data)
|
||||
static gboolean
|
||||
gst_aggregator_check_pads_ready (GstAggregator * self)
|
||||
{
|
||||
if (aggpad->buffer || aggpad->eos) {
|
||||
return TRUE;
|
||||
GstAggregatorPad *pad;
|
||||
GList *l, *sinkpads;
|
||||
|
||||
GST_LOG_OBJECT (self, "checking pads");
|
||||
|
||||
GST_OBJECT_LOCK (self);
|
||||
|
||||
sinkpads = GST_ELEMENT_CAST (self)->sinkpads;
|
||||
if (sinkpads == NULL)
|
||||
goto no_sinkpads;
|
||||
|
||||
for (l = sinkpads; l != NULL; l = l->next) {
|
||||
pad = l->data;
|
||||
|
||||
if (pad->buffer == NULL && !pad->eos)
|
||||
goto pad_not_ready;
|
||||
}
|
||||
|
||||
GST_LOG_OBJECT (aggpad, "Not ready to be aggregated");
|
||||
GST_OBJECT_UNLOCK (self);
|
||||
GST_LOG_OBJECT (self, "pads are ready");
|
||||
return TRUE;
|
||||
|
||||
no_sinkpads:
|
||||
{
|
||||
GST_LOG_OBJECT (self, "pads not ready: no sink pads");
|
||||
GST_OBJECT_UNLOCK (self);
|
||||
return FALSE;
|
||||
}
|
||||
pad_not_ready:
|
||||
{
|
||||
GST_LOG_OBJECT (pad, "pad not ready to be aggregated yet");
|
||||
GST_OBJECT_UNLOCK (self);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_aggregator_reset_flow_values (GstAggregator * self)
|
||||
|
@ -502,8 +528,7 @@ gst_aggregator_wait_and_check (GstAggregator * self, gboolean * timeout)
|
|||
|
||||
gst_aggregator_get_latency (self, &live, &latency_min, &latency_max);
|
||||
|
||||
if (gst_aggregator_iterate_sinkpads (self,
|
||||
gst_aggregator_check_all_pads_with_data_or_eos, NULL)) {
|
||||
if (gst_aggregator_check_pads_ready (self)) {
|
||||
GST_DEBUG_OBJECT (self, "all pads have data");
|
||||
SRC_STREAM_UNLOCK (self);
|
||||
|
||||
|
@ -580,8 +605,7 @@ gst_aggregator_wait_and_check (GstAggregator * self, gboolean * timeout)
|
|||
}
|
||||
}
|
||||
|
||||
res = gst_aggregator_iterate_sinkpads (self,
|
||||
gst_aggregator_check_all_pads_with_data_or_eos, NULL);
|
||||
res = gst_aggregator_check_pads_ready (self);
|
||||
SRC_STREAM_UNLOCK (self);
|
||||
|
||||
return res;
|
||||
|
@ -1617,7 +1641,6 @@ gst_aggregator_class_init (GstAggregatorClass * klass)
|
|||
(G_MAXLONG == G_MAXINT64) ? G_MAXINT64 : (G_MAXLONG * GST_SECOND - 1),
|
||||
DEFAULT_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
GST_DEBUG_REGISTER_FUNCPTR (gst_aggregator_check_all_pads_with_data_or_eos);
|
||||
GST_DEBUG_REGISTER_FUNCPTR (gst_aggregator_stop_pad);
|
||||
GST_DEBUG_REGISTER_FUNCPTR (gst_aggregator_query_sink_latency_foreach);
|
||||
GST_DEBUG_REGISTER_FUNCPTR (gst_aggregator_set_flush_pending);
|
||||
|
@ -1737,8 +1760,7 @@ gst_aggregator_pad_chain (GstPad * pad, GstObject * object, GstBuffer * buffer)
|
|||
PAD_STREAM_UNLOCK (aggpad);
|
||||
|
||||
SRC_STREAM_LOCK (self);
|
||||
if (gst_aggregator_iterate_sinkpads (self,
|
||||
gst_aggregator_check_all_pads_with_data_or_eos, NULL))
|
||||
if (gst_aggregator_check_pads_ready (self))
|
||||
SRC_STREAM_BROADCAST_UNLOCKED (self);
|
||||
SRC_STREAM_UNLOCK (self);
|
||||
|
||||
|
|
Loading…
Reference in a new issue