/* Our state is >= PAUSED */
gboolean running; /* protected by SRC_STREAM_LOCK */
-
gint seqnum;
gboolean send_stream_start;
gboolean send_segment;
gboolean send_eos;
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;
GstTagList *tags;
GST_LOG_OBJECT (self, "Checking aggregate");
while (priv->send_eos && priv->running) {
+ GstFlowReturn flow_return;
+
if (!gst_aggregator_wait_and_check (self, &timeout))
continue;
GST_TRACE_OBJECT (self, "Actually aggregating!");
- priv->flow_return = klass->aggregate (self, timeout);
-
- if (priv->flow_return == GST_FLOW_EOS) {
- gst_aggregator_push_eos (self);
- }
+ flow_return = klass->aggregate (self, timeout);
GST_OBJECT_LOCK (self);
- if (priv->flow_return == GST_FLOW_FLUSHING && priv->flush_seeking)
+ 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);
- GST_LOG_OBJECT (self, "flow return is %s",
- gst_flow_get_name (priv->flow_return));
+ if (flow_return == GST_FLOW_EOS) {
+ gst_aggregator_push_eos (self);
+ }
- if (priv->flow_return != GST_FLOW_OK)
+ GST_LOG_OBJECT (self, "flow return is %s", gst_flow_get_name (flow_return));
+
+ if (flow_return != GST_FLOW_OK)
break;
}
}
GstAggregatorPrivate *priv = self->priv;
GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
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, "Done chaining");
- return priv->flow_return;
+ GST_OBJECT_LOCK (self);
+ flow_return = priv->flow_return;
+ GST_OBJECT_UNLOCK (self);
+
+ return flow_return;
flushing:
PAD_STREAM_UNLOCK (aggpad);