mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
aggregator: Add a timeout parameter to ::aggregate()
When this is TRUE, we really have to produce output. This happens in live mixing mode when we have to output something for the current time, no matter if we have enough input or not.
This commit is contained in:
parent
344c85da76
commit
435a477f63
3 changed files with 10 additions and 5 deletions
|
@ -486,12 +486,14 @@ gst_aggregator_get_next_time (GstAggregator * self)
|
|||
|
||||
/* called with the src STREAM lock */
|
||||
static gboolean
|
||||
_wait_and_check (GstAggregator * self)
|
||||
_wait_and_check (GstAggregator * self, gboolean * timeout)
|
||||
{
|
||||
GstClockTime latency_max, latency_min;
|
||||
GstClockTime start;
|
||||
gboolean live;
|
||||
|
||||
*timeout = FALSE;
|
||||
|
||||
gst_aggregator_get_latency (self, &live, &latency_min, &latency_max);
|
||||
|
||||
if (gst_aggregator_iterate_sinkpads (self,
|
||||
|
@ -561,6 +563,7 @@ _wait_and_check (GstAggregator * self)
|
|||
/* we timed out */
|
||||
if (status == GST_CLOCK_OK || status == GST_CLOCK_EARLY) {
|
||||
SRC_STREAM_UNLOCK (self);
|
||||
*timeout = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -575,6 +578,7 @@ aggregate_func (GstAggregator * self)
|
|||
{
|
||||
GstAggregatorPrivate *priv = self->priv;
|
||||
GstAggregatorClass *klass = GST_AGGREGATOR_GET_CLASS (self);
|
||||
gboolean timeout = FALSE;
|
||||
|
||||
if (self->priv->running == FALSE) {
|
||||
GST_DEBUG_OBJECT (self, "Not running anymore");
|
||||
|
@ -583,12 +587,12 @@ aggregate_func (GstAggregator * self)
|
|||
|
||||
GST_LOG_OBJECT (self, "Checking aggregate");
|
||||
while (priv->send_eos && priv->running) {
|
||||
if (!_wait_and_check (self))
|
||||
if (!_wait_and_check (self, &timeout))
|
||||
continue;
|
||||
|
||||
GST_TRACE_OBJECT (self, "Actually aggregating!");
|
||||
|
||||
priv->flow_return = klass->aggregate (self);
|
||||
priv->flow_return = klass->aggregate (self, timeout);
|
||||
|
||||
if (priv->flow_return == GST_FLOW_EOS) {
|
||||
_push_eos (self);
|
||||
|
|
|
@ -237,7 +237,8 @@ struct _GstAggregatorClass {
|
|||
GstPadMode mode,
|
||||
gboolean active);
|
||||
|
||||
GstFlowReturn (*aggregate) (GstAggregator * aggregator);
|
||||
GstFlowReturn (*aggregate) (GstAggregator * aggregator,
|
||||
gboolean timeout);
|
||||
|
||||
gboolean (*stop) (GstAggregator * aggregator);
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ struct _GstTestAggregatorClass
|
|||
};
|
||||
|
||||
static GstFlowReturn
|
||||
gst_test_aggregator_aggregate (GstAggregator * aggregator)
|
||||
gst_test_aggregator_aggregate (GstAggregator * aggregator, gboolean timeout)
|
||||
{
|
||||
GstIterator *iter;
|
||||
gboolean all_eos = TRUE;
|
||||
|
|
Loading…
Reference in a new issue