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:
Wim Taymans 2012-02-15 10:11:35 +01:00
parent 58ecde9db9
commit 63ba55865c
2 changed files with 35 additions and 47 deletions

View file

@ -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 */

View file

@ -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