mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-25 11:11:08 +00:00
aggregator: Consistenly lock the flow_return state
Use the object's lock to protect it. https://bugzilla.gnome.org/show_bug.cgi?id=742684
This commit is contained in:
parent
90f3cb4af0
commit
25faafaf58
1 changed files with 26 additions and 12 deletions
|
@ -214,7 +214,6 @@ struct _GstAggregatorPrivate
|
||||||
/* Our state is >= PAUSED */
|
/* Our state is >= PAUSED */
|
||||||
gboolean running; /* protected by SRC_STREAM_LOCK */
|
gboolean running; /* protected by SRC_STREAM_LOCK */
|
||||||
|
|
||||||
|
|
||||||
gint seqnum;
|
gint seqnum;
|
||||||
gboolean send_stream_start;
|
gboolean send_stream_start;
|
||||||
gboolean send_segment;
|
gboolean send_segment;
|
||||||
|
@ -223,6 +222,13 @@ struct _GstAggregatorPrivate
|
||||||
gboolean send_eos;
|
gboolean send_eos;
|
||||||
GstFlowReturn flow_return;
|
GstFlowReturn flow_return;
|
||||||
|
|
||||||
|
gboolean send_stream_start; /* protected by srcpad stream lock */
|
||||||
|
gboolean send_segment; /* protected by object lock */
|
||||||
|
gboolean flush_seeking; /* protected by object lock */
|
||||||
|
gboolean pending_flush_start; /* protected by object lock */
|
||||||
|
gboolean send_eos; /* protected by srcpad stream lock */
|
||||||
|
GstFlowReturn flow_return; /* protected by object lock */
|
||||||
|
|
||||||
GstCaps *srccaps;
|
GstCaps *srccaps;
|
||||||
|
|
||||||
GstTagList *tags;
|
GstTagList *tags;
|
||||||
|
@ -635,26 +641,29 @@ gst_aggregator_aggregate_func (GstAggregator * self)
|
||||||
|
|
||||||
GST_LOG_OBJECT (self, "Checking aggregate");
|
GST_LOG_OBJECT (self, "Checking aggregate");
|
||||||
while (priv->send_eos && priv->running) {
|
while (priv->send_eos && priv->running) {
|
||||||
|
GstFlowReturn flow_return;
|
||||||
|
|
||||||
if (!gst_aggregator_wait_and_check (self, &timeout))
|
if (!gst_aggregator_wait_and_check (self, &timeout))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
GST_TRACE_OBJECT (self, "Actually aggregating!");
|
GST_TRACE_OBJECT (self, "Actually aggregating!");
|
||||||
|
|
||||||
priv->flow_return = klass->aggregate (self, timeout);
|
flow_return = klass->aggregate (self, timeout);
|
||||||
|
|
||||||
if (priv->flow_return == GST_FLOW_EOS) {
|
GST_OBJECT_LOCK (self);
|
||||||
|
if (flow_return == GST_FLOW_FLUSHING && priv->flush_seeking)
|
||||||
|
priv->flow_return = GST_FLOW_OK;
|
||||||
|
else
|
||||||
|
priv->flow_return = flow_return;
|
||||||
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
|
||||||
|
if (flow_return == GST_FLOW_EOS) {
|
||||||
gst_aggregator_push_eos (self);
|
gst_aggregator_push_eos (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_OBJECT_LOCK (self);
|
GST_LOG_OBJECT (self, "flow return is %s", gst_flow_get_name (flow_return));
|
||||||
if (priv->flow_return == GST_FLOW_FLUSHING && priv->flush_seeking)
|
|
||||||
priv->flow_return = GST_FLOW_OK;
|
|
||||||
GST_OBJECT_UNLOCK (self);
|
|
||||||
|
|
||||||
GST_LOG_OBJECT (self, "flow return is %s",
|
if (flow_return != GST_FLOW_OK)
|
||||||
gst_flow_get_name (priv->flow_return));
|
|
||||||
|
|
||||||
if (priv->flow_return != GST_FLOW_OK)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1761,6 +1770,7 @@ gst_aggregator_pad_chain (GstPad * pad, GstObject * object, GstBuffer * buffer)
|
||||||
GstAggregatorPrivate *priv = self->priv;
|
GstAggregatorPrivate *priv = self->priv;
|
||||||
GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
|
GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
|
||||||
GstAggregatorClass *aggclass = GST_AGGREGATOR_GET_CLASS (object);
|
GstAggregatorClass *aggclass = GST_AGGREGATOR_GET_CLASS (object);
|
||||||
|
GstFlowReturn flow_return;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (aggpad, "Start chaining a buffer %" GST_PTR_FORMAT, buffer);
|
GST_DEBUG_OBJECT (aggpad, "Start chaining a buffer %" GST_PTR_FORMAT, buffer);
|
||||||
|
|
||||||
|
@ -1801,7 +1811,11 @@ gst_aggregator_pad_chain (GstPad * pad, GstObject * object, GstBuffer * buffer)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (aggpad, "Done chaining");
|
GST_DEBUG_OBJECT (aggpad, "Done chaining");
|
||||||
|
|
||||||
return priv->flow_return;
|
GST_OBJECT_LOCK (self);
|
||||||
|
flow_return = priv->flow_return;
|
||||||
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
|
||||||
|
return flow_return;
|
||||||
|
|
||||||
flushing:
|
flushing:
|
||||||
PAD_STREAM_UNLOCK (aggpad);
|
PAD_STREAM_UNLOCK (aggpad);
|
||||||
|
|
Loading…
Reference in a new issue