aggregator: Use the event_full function for GstAggregatorPads

Allowing us to tell GstPad why we are failing an event, which might
be because we are 'flushing' even if the sinkpad is not in flush state
at that point.
This commit is contained in:
Thibault Saunier 2016-09-06 16:05:53 -03:00 committed by Tim-Philipp Müller
parent 885c95c3ed
commit 5fefb1b866

View file

@ -2310,10 +2310,11 @@ flushing:
return FALSE;
}
static gboolean
static GstFlowReturn
gst_aggregator_pad_event_func (GstPad * pad, GstObject * parent,
GstEvent * event)
{
GstFlowReturn ret = GST_FLOW_OK;
GstAggregator *self = GST_AGGREGATOR (parent);
GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
GstAggregatorClass *klass = GST_AGGREGATOR_GET_CLASS (parent);
@ -2324,8 +2325,10 @@ gst_aggregator_pad_event_func (GstPad * pad, GstObject * parent,
PAD_LOCK (aggpad);
if (aggpad->priv->flow_return != GST_FLOW_OK
&& GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_STOP)
&& GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_STOP) {
ret = aggpad->priv->flow_return;
goto flushing;
}
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
GST_OBJECT_LOCK (aggpad);
@ -2347,10 +2350,22 @@ gst_aggregator_pad_event_func (GstPad * pad, GstObject * parent,
SRC_UNLOCK (self);
}
if (event)
return klass->sink_event (self, aggpad, event);
else
return TRUE;
if (event) {
if (!klass->sink_event (self, aggpad, event)) {
/* Copied from GstPad to convert boolean to a GstFlowReturn in
* the event handling func */
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_CAPS:
ret = GST_FLOW_NOT_NEGOTIATED;
break;
default:
ret = GST_FLOW_ERROR;
break;
}
}
}
return ret;
flushing:
GST_DEBUG_OBJECT (aggpad, "Pad is %s, dropping event",
@ -2360,7 +2375,8 @@ flushing:
if (GST_EVENT_IS_STICKY (event))
gst_pad_store_sticky_event (pad, event);
gst_event_unref (event);
return FALSE;
return ret;
}
static gboolean
@ -2397,8 +2413,9 @@ gst_aggregator_pad_constructed (GObject * object)
gst_pad_set_chain_function (pad,
GST_DEBUG_FUNCPTR (gst_aggregator_pad_chain));
gst_pad_set_event_function (pad,
GST_DEBUG_FUNCPTR (gst_aggregator_pad_event_func));
gst_pad_set_event_full_function_full (pad,
GST_DEBUG_FUNCPTR (gst_aggregator_pad_event_func),
NULL, NULL);
gst_pad_set_query_function (pad,
GST_DEBUG_FUNCPTR (gst_aggregator_pad_query_func));
gst_pad_set_activatemode_function (pad,