From 63350d193075095bccec0e55cb1879f6d3b6451a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Tue, 16 Mar 2021 19:02:06 -0400 Subject: [PATCH] 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: --- libs/gst/base/gstaggregator.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/gst/base/gstaggregator.c b/libs/gst/base/gstaggregator.c index 44f2b42090..55c41c920b 100644 --- a/libs/gst/base/gstaggregator.c +++ b/libs/gst/base/gstaggregator.c @@ -2033,7 +2033,7 @@ gst_aggregator_request_new_pad (GstElement * element, return GST_PAD (agg_pad); } -/* Must be called with SRC_LOCK held */ +/* Must be called with SRC_LOCK held, temporarily releases it! */ static gboolean 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; 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); + SRC_LOCK (self); if (!query_ret) { 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)) { + SRC_UNLOCK (self); GST_ELEMENT_WARNING (self, CORE, CLOCK, (NULL), ("Impossible to configure latency: max %" GST_TIME_FORMAT " < min %" GST_TIME_FORMAT ". Add queues or other buffering elements.", GST_TIME_ARGS (max), GST_TIME_ARGS (min))); + SRC_LOCK (self); 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 */