mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-03 21:12:26 +00:00
baseparse: chain up to parent for defaults
Chain up to the parent instead of using the FALSE return value from the event function (because it's otherwise impossible to return an error).
This commit is contained in:
parent
58ecde9db9
commit
63ba55865c
2 changed files with 35 additions and 47 deletions
|
@ -526,6 +526,7 @@ gst_base_parse_class_init (GstBaseParseClass * klass)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Default handlers */
|
/* Default handlers */
|
||||||
|
klass->event = gst_base_parse_sink_eventfunc;
|
||||||
klass->src_event = gst_base_parse_src_eventfunc;
|
klass->src_event = gst_base_parse_src_eventfunc;
|
||||||
klass->convert = gst_base_parse_convert_default;
|
klass->convert = gst_base_parse_convert_default;
|
||||||
|
|
||||||
|
@ -863,8 +864,7 @@ gst_base_parse_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstBaseParse *parse;
|
GstBaseParse *parse;
|
||||||
GstBaseParseClass *bclass;
|
GstBaseParseClass *bclass;
|
||||||
gboolean handled = FALSE;
|
gboolean ret;
|
||||||
gboolean ret = TRUE;
|
|
||||||
|
|
||||||
parse = GST_BASE_PARSE (parent);
|
parse = GST_BASE_PARSE (parent);
|
||||||
bclass = GST_BASE_PARSE_GET_CLASS (parse);
|
bclass = GST_BASE_PARSE_GET_CLASS (parse);
|
||||||
|
@ -895,13 +895,9 @@ gst_base_parse_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
gst_base_parse_post_bitrates (parse, TRUE, TRUE, TRUE);
|
gst_base_parse_post_bitrates (parse, TRUE, TRUE, TRUE);
|
||||||
|
|
||||||
if (bclass->event)
|
if (bclass->event)
|
||||||
handled = bclass->event (parse, event);
|
ret = bclass->event (parse, event);
|
||||||
|
else
|
||||||
if (!handled)
|
ret = FALSE;
|
||||||
handled = gst_base_parse_sink_eventfunc (parse, event);
|
|
||||||
|
|
||||||
if (!handled)
|
|
||||||
ret = gst_pad_event_default (pad, parent, event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (parse, "event handled");
|
GST_DEBUG_OBJECT (parse, "event handled");
|
||||||
|
@ -924,7 +920,7 @@ gst_base_parse_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
{
|
{
|
||||||
gboolean handled = FALSE;
|
gboolean ret;
|
||||||
GstEvent **eventp;
|
GstEvent **eventp;
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
|
@ -939,11 +935,12 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
GST_DEBUG_OBJECT (parse, "caps: %" GST_PTR_FORMAT, caps);
|
GST_DEBUG_OBJECT (parse, "caps: %" GST_PTR_FORMAT, caps);
|
||||||
|
|
||||||
if (klass->set_sink_caps)
|
if (klass->set_sink_caps)
|
||||||
klass->set_sink_caps (parse, caps);
|
ret = klass->set_sink_caps (parse, caps);
|
||||||
|
else
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
/* will send our own caps downstream */
|
/* will send our own caps downstream */
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
handled = TRUE;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_EVENT_SEGMENT:
|
case GST_EVENT_SEGMENT:
|
||||||
|
@ -1049,7 +1046,7 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
eventp = &parse->priv->pending_segment;
|
eventp = &parse->priv->pending_segment;
|
||||||
gst_event_replace (eventp, event);
|
gst_event_replace (eventp, event);
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
handled = TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
/* but finish the current segment */
|
/* but finish the current segment */
|
||||||
GST_DEBUG_OBJECT (parse, "draining current segment");
|
GST_DEBUG_OBJECT (parse, "draining current segment");
|
||||||
|
@ -1070,16 +1067,14 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
|
|
||||||
case GST_EVENT_FLUSH_START:
|
case GST_EVENT_FLUSH_START:
|
||||||
parse->priv->flushing = TRUE;
|
parse->priv->flushing = TRUE;
|
||||||
handled = gst_pad_push_event (parse->srcpad, gst_event_ref (event));
|
ret = gst_pad_push_event (parse->srcpad, event);
|
||||||
if (handled)
|
|
||||||
gst_event_unref (event);
|
|
||||||
/* Wait for _chain() to exit by taking the srcpad STREAM_LOCK */
|
/* Wait for _chain() to exit by taking the srcpad STREAM_LOCK */
|
||||||
GST_PAD_STREAM_LOCK (parse->srcpad);
|
GST_PAD_STREAM_LOCK (parse->srcpad);
|
||||||
GST_PAD_STREAM_UNLOCK (parse->srcpad);
|
GST_PAD_STREAM_UNLOCK (parse->srcpad);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_EVENT_FLUSH_STOP:
|
case GST_EVENT_FLUSH_STOP:
|
||||||
|
ret = gst_pad_push_event (parse->srcpad, event);
|
||||||
gst_adapter_clear (parse->priv->adapter);
|
gst_adapter_clear (parse->priv->adapter);
|
||||||
gst_base_parse_clear_queues (parse);
|
gst_base_parse_clear_queues (parse);
|
||||||
parse->priv->flushing = FALSE;
|
parse->priv->flushing = FALSE;
|
||||||
|
@ -1107,13 +1102,16 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
gst_pad_push_event (parse->srcpad, parse->priv->pending_segment);
|
gst_pad_push_event (parse->srcpad, parse->priv->pending_segment);
|
||||||
parse->priv->pending_segment = NULL;
|
parse->priv->pending_segment = NULL;
|
||||||
}
|
}
|
||||||
|
ret = gst_pad_push_event (parse->srcpad, event);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
ret =
|
||||||
|
gst_pad_event_default (parse->sinkpad, GST_OBJECT_CAST (parse),
|
||||||
|
event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
return handled;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1184,7 +1182,6 @@ gst_base_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstBaseParse *parse;
|
GstBaseParse *parse;
|
||||||
GstBaseParseClass *bclass;
|
GstBaseParseClass *bclass;
|
||||||
gboolean handled = FALSE;
|
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
|
|
||||||
parse = GST_BASE_PARSE (parent);
|
parse = GST_BASE_PARSE (parent);
|
||||||
|
@ -1194,10 +1191,9 @@ gst_base_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
||||||
GST_EVENT_TYPE_NAME (event));
|
GST_EVENT_TYPE_NAME (event));
|
||||||
|
|
||||||
if (bclass->src_event)
|
if (bclass->src_event)
|
||||||
handled = bclass->src_event (parse, event);
|
ret = bclass->src_event (parse, event);
|
||||||
|
else
|
||||||
if (!handled)
|
gst_event_unref (event);
|
||||||
ret = gst_pad_event_default (pad, parent, event);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1221,20 +1217,19 @@ gst_base_parse_is_seekable (GstBaseParse * parse)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_base_parse_src_eventfunc (GstBaseParse * parse, GstEvent * event)
|
gst_base_parse_src_eventfunc (GstBaseParse * parse, GstEvent * event)
|
||||||
{
|
{
|
||||||
gboolean handled = FALSE;
|
gboolean res = FALSE;
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
case GST_EVENT_SEEK:
|
case GST_EVENT_SEEK:
|
||||||
{
|
if (gst_base_parse_is_seekable (parse))
|
||||||
if (gst_base_parse_is_seekable (parse)) {
|
res = gst_base_parse_handle_seek (parse, event);
|
||||||
handled = gst_base_parse_handle_seek (parse, event);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
|
res = gst_pad_event_default (parse->srcpad, GST_OBJECT_CAST (parse),
|
||||||
|
event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return handled;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3343,6 +3338,8 @@ gst_base_parse_get_duration (GstBaseParse * parse, GstFormat format,
|
||||||
GST_LOG_OBJECT (parse, "using estimated duration");
|
GST_LOG_OBJECT (parse, "using estimated duration");
|
||||||
*duration = parse->priv->estimated_duration;
|
*duration = parse->priv->estimated_duration;
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
|
} else {
|
||||||
|
GST_LOG_OBJECT (parse, "cannot estimate duration");
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_LOG_OBJECT (parse, "res: %d, duration %" GST_TIME_FORMAT, res,
|
GST_LOG_OBJECT (parse, "res: %d, duration %" GST_TIME_FORMAT, res,
|
||||||
|
@ -3793,16 +3790,9 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
|
||||||
/* For any format other than TIME, see if upstream handles
|
/* For any format other than TIME, see if upstream handles
|
||||||
* it directly or fail. For TIME, try upstream, but do it ourselves if
|
* it directly or fail. For TIME, try upstream, but do it ourselves if
|
||||||
* it fails upstream */
|
* it fails upstream */
|
||||||
if (format != GST_FORMAT_TIME) {
|
res = gst_pad_push_event (parse->sinkpad, event);
|
||||||
/* default action delegates to upstream */
|
if (format != GST_FORMAT_TIME || res)
|
||||||
res = FALSE;
|
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
|
||||||
gst_event_ref (event);
|
|
||||||
if ((res = gst_pad_push_event (parse->sinkpad, event))) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get flush flag */
|
/* get flush flag */
|
||||||
flush = flags & GST_SEEK_FLAG_FLUSH;
|
flush = flags & GST_SEEK_FLAG_FLUSH;
|
||||||
|
@ -3989,9 +3979,6 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
/* handled event is ours to free */
|
|
||||||
if (res)
|
|
||||||
gst_event_unref (event);
|
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
|
|
|
@ -208,11 +208,12 @@ struct _GstBaseParse {
|
||||||
* @convert: Optional.
|
* @convert: Optional.
|
||||||
* Convert between formats.
|
* Convert between formats.
|
||||||
* @event: Optional.
|
* @event: Optional.
|
||||||
* Event handler on the sink pad. This function should return
|
* Event handler on the sink pad. This function should chain
|
||||||
* TRUE if the event was handled and can be dropped.
|
* up to the parent implementation to let the default handler
|
||||||
|
* run.
|
||||||
* @src_event: Optional.
|
* @src_event: Optional.
|
||||||
* Event handler on the source pad. Should return TRUE
|
* Event handler on the source pad. Should chain up to the
|
||||||
* if the event was handled and can be dropped.
|
* parent to let the default handler run.
|
||||||
* @pre_push_frame: Optional.
|
* @pre_push_frame: Optional.
|
||||||
* Called just prior to pushing a frame (after any pending
|
* Called just prior to pushing a frame (after any pending
|
||||||
* events have been sent) to give subclass a chance to perform
|
* events have been sent) to give subclass a chance to perform
|
||||||
|
|
Loading…
Reference in a new issue