aggregator: Release the SRC lock while querying latency

This is required because the query could be intercepted and the
application could send any other requests to the element from this
thread.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/834>
This commit is contained in:
Olivier Crête 2021-03-16 19:02:06 -04:00 committed by Tim-Philipp Müller
parent 53c68d92d8
commit 63350d1930

View file

@ -2033,7 +2033,7 @@ gst_aggregator_request_new_pad (GstElement * element,
return GST_PAD (agg_pad); return GST_PAD (agg_pad);
} }
/* Must be called with SRC_LOCK held */ /* Must be called with SRC_LOCK held, temporarily releases it! */
static gboolean static gboolean
gst_aggregator_query_latency_unlocked (GstAggregator * self, GstQuery * query) gst_aggregator_query_latency_unlocked (GstAggregator * self, GstQuery * query)
@ -2041,7 +2041,10 @@ gst_aggregator_query_latency_unlocked (GstAggregator * self, GstQuery * query)
gboolean query_ret, live; gboolean query_ret, live;
GstClockTime our_latency, min, max; GstClockTime our_latency, min, max;
/* Temporarily release the lock to do the query. */
SRC_UNLOCK (self);
query_ret = gst_pad_query_default (self->srcpad, GST_OBJECT (self), query); query_ret = gst_pad_query_default (self->srcpad, GST_OBJECT (self), query);
SRC_LOCK (self);
if (!query_ret) { if (!query_ret) {
GST_WARNING_OBJECT (self, "Latency query failed"); GST_WARNING_OBJECT (self, "Latency query failed");
@ -2067,10 +2070,12 @@ gst_aggregator_query_latency_unlocked (GstAggregator * self, GstQuery * query)
} }
if (min > max && GST_CLOCK_TIME_IS_VALID (max)) { if (min > max && GST_CLOCK_TIME_IS_VALID (max)) {
SRC_UNLOCK (self);
GST_ELEMENT_WARNING (self, CORE, CLOCK, (NULL), GST_ELEMENT_WARNING (self, CORE, CLOCK, (NULL),
("Impossible to configure latency: max %" GST_TIME_FORMAT " < min %" ("Impossible to configure latency: max %" GST_TIME_FORMAT " < min %"
GST_TIME_FORMAT ". Add queues or other buffering elements.", GST_TIME_FORMAT ". Add queues or other buffering elements.",
GST_TIME_ARGS (max), GST_TIME_ARGS (min))); GST_TIME_ARGS (max), GST_TIME_ARGS (min)));
SRC_LOCK (self);
return FALSE; return FALSE;
} }
@ -2101,7 +2106,8 @@ gst_aggregator_query_latency_unlocked (GstAggregator * self, GstQuery * query)
} }
/* /*
* MUST be called with the src_lock held. * MUST be called with the src_lock held. Temporarily releases the lock inside
* gst_aggregator_query_latency_unlocked() to do the actual query!
* *
* See gst_aggregator_get_latency() for doc * See gst_aggregator_get_latency() for doc
*/ */