#endif
/* Default handlers */
+ klass->event = gst_base_parse_sink_eventfunc;
klass->src_event = gst_base_parse_src_eventfunc;
klass->convert = gst_base_parse_convert_default;
{
GstBaseParse *parse;
GstBaseParseClass *bclass;
- gboolean handled = FALSE;
- gboolean ret = TRUE;
+ gboolean ret;
parse = GST_BASE_PARSE (parent);
bclass = GST_BASE_PARSE_GET_CLASS (parse);
gst_base_parse_post_bitrates (parse, TRUE, TRUE, TRUE);
if (bclass->event)
- handled = bclass->event (parse, event);
-
- if (!handled)
- handled = gst_base_parse_sink_eventfunc (parse, event);
-
- if (!handled)
- ret = gst_pad_event_default (pad, parent, event);
+ ret = bclass->event (parse, event);
+ else
+ ret = FALSE;
}
GST_DEBUG_OBJECT (parse, "event handled");
static gboolean
gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
{
- gboolean handled = FALSE;
+ gboolean ret;
GstEvent **eventp;
switch (GST_EVENT_TYPE (event)) {
GST_DEBUG_OBJECT (parse, "caps: %" GST_PTR_FORMAT, 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 */
gst_event_unref (event);
- handled = TRUE;
break;
}
case GST_EVENT_SEGMENT:
eventp = &parse->priv->pending_segment;
gst_event_replace (eventp, event);
gst_event_unref (event);
- handled = TRUE;
+ ret = TRUE;
/* but finish the current segment */
GST_DEBUG_OBJECT (parse, "draining current segment");
case GST_EVENT_FLUSH_START:
parse->priv->flushing = TRUE;
- handled = gst_pad_push_event (parse->srcpad, gst_event_ref (event));
- if (handled)
- gst_event_unref (event);
+ ret = gst_pad_push_event (parse->srcpad, event);
/* Wait for _chain() to exit by taking the srcpad STREAM_LOCK */
GST_PAD_STREAM_LOCK (parse->srcpad);
GST_PAD_STREAM_UNLOCK (parse->srcpad);
-
break;
case GST_EVENT_FLUSH_STOP:
+ ret = gst_pad_push_event (parse->srcpad, event);
gst_adapter_clear (parse->priv->adapter);
gst_base_parse_clear_queues (parse);
parse->priv->flushing = FALSE;
gst_pad_push_event (parse->srcpad, parse->priv->pending_segment);
parse->priv->pending_segment = NULL;
}
+ ret = gst_pad_push_event (parse->srcpad, event);
break;
default:
+ ret =
+ gst_pad_event_default (parse->sinkpad, GST_OBJECT_CAST (parse),
+ event);
break;
}
-
- return handled;
+ return ret;
}
static gboolean
{
GstBaseParse *parse;
GstBaseParseClass *bclass;
- gboolean handled = FALSE;
gboolean ret = TRUE;
parse = GST_BASE_PARSE (parent);
GST_EVENT_TYPE_NAME (event));
if (bclass->src_event)
- handled = bclass->src_event (parse, event);
-
- if (!handled)
- ret = gst_pad_event_default (pad, parent, event);
+ ret = bclass->src_event (parse, event);
+ else
+ gst_event_unref (event);
return ret;
}
static gboolean
gst_base_parse_src_eventfunc (GstBaseParse * parse, GstEvent * event)
{
- gboolean handled = FALSE;
+ gboolean res = FALSE;
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEEK:
- {
- if (gst_base_parse_is_seekable (parse)) {
- handled = gst_base_parse_handle_seek (parse, event);
- }
+ if (gst_base_parse_is_seekable (parse))
+ res = gst_base_parse_handle_seek (parse, event);
break;
- }
default:
+ res = gst_pad_event_default (parse->srcpad, GST_OBJECT_CAST (parse),
+ event);
break;
}
- return handled;
+ return res;
}
GST_LOG_OBJECT (parse, "using estimated duration");
*duration = parse->priv->estimated_duration;
res = TRUE;
+ } else {
+ GST_LOG_OBJECT (parse, "cannot estimate duration");
}
GST_LOG_OBJECT (parse, "res: %d, duration %" GST_TIME_FORMAT, res,
/* For any format other than TIME, see if upstream handles
* it directly or fail. For TIME, try upstream, but do it ourselves if
* it fails upstream */
- if (format != GST_FORMAT_TIME) {
- /* default action delegates to upstream */
- res = FALSE;
+ res = gst_pad_push_event (parse->sinkpad, event);
+ if (format != GST_FORMAT_TIME || res)
goto done;
- } else {
- gst_event_ref (event);
- if ((res = gst_pad_push_event (parse->sinkpad, event))) {
- goto done;
- }
- }
/* get flush flag */
flush = flags & GST_SEEK_FLAG_FLUSH;
}
done:
- /* handled event is ours to free */
- if (res)
- gst_event_unref (event);
return res;
/* ERRORS */