baseparse: make activation code more like other

Make the pad activation code look more like other activation code.
Only start the sinkpad task when we decide to activate in pull mode, when we
later add srcpad pullmode this will be needed.
This commit is contained in:
Wim Taymans 2012-02-15 12:19:13 +01:00
parent 592ead764c
commit b6b239ceaa

View file

@ -3013,7 +3013,6 @@ static gboolean
gst_base_parse_sink_activate (GstPad * sinkpad, GstObject * parent) gst_base_parse_sink_activate (GstPad * sinkpad, GstObject * parent)
{ {
GstBaseParse *parse; GstBaseParse *parse;
gboolean result = TRUE;
GstQuery *query; GstQuery *query;
gboolean pull_mode; gboolean pull_mode;
@ -3022,24 +3021,29 @@ gst_base_parse_sink_activate (GstPad * sinkpad, GstObject * parent)
GST_DEBUG_OBJECT (parse, "sink activate"); GST_DEBUG_OBJECT (parse, "sink activate");
query = gst_query_new_scheduling (); query = gst_query_new_scheduling ();
result = gst_pad_peer_query (sinkpad, query); if (!gst_pad_peer_query (sinkpad, query)) {
if (result) { gst_query_unref (query);
pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL); goto baseparse_push;
} else {
pull_mode = FALSE;
} }
pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL);
gst_query_unref (query); gst_query_unref (query);
if (pull_mode) { if (!pull_mode)
GST_DEBUG_OBJECT (parse, "trying to activate in pull mode"); goto baseparse_push;
result = gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
} else {
GST_DEBUG_OBJECT (parse, "trying to activate in push mode");
result = gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
}
GST_DEBUG_OBJECT (parse, "sink activate return %d", result); GST_DEBUG_OBJECT (parse, "trying to activate in pull mode");
return result; if (!gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE))
goto baseparse_push;
return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_base_parse_loop,
sinkpad);
/* fallback */
baseparse_push:
{
GST_DEBUG_OBJECT (parse, "trying to activate in push mode");
return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
}
} }
static gboolean static gboolean
@ -3078,38 +3082,42 @@ static gboolean
gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent, gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent,
GstPadMode mode, gboolean active) GstPadMode mode, gboolean active)
{ {
gboolean result = TRUE; gboolean result;
GstBaseParse *parse; GstBaseParse *parse;
parse = GST_BASE_PARSE (parent); parse = GST_BASE_PARSE (parent);
GST_DEBUG_OBJECT (parse, "sink activate mode %d, %d", mode, active); GST_DEBUG_OBJECT (parse, "sink activate mode %d, %d", mode, active);
result = gst_base_parse_activate (parse, active); if (!gst_base_parse_activate (parse, active))
goto activate_failed;
if (result) {
switch (mode) { switch (mode) {
case GST_PAD_MODE_PULL: case GST_PAD_MODE_PULL:
if (active) { if (active) {
parse->priv->pending_segment = parse->priv->pending_segment = gst_event_new_segment (&parse->segment);
gst_event_new_segment (&parse->segment); result = TRUE;
result &=
gst_pad_start_task (pad, (GstTaskFunction) gst_base_parse_loop,
pad);
} else { } else {
result &= gst_pad_stop_task (pad); result = gst_pad_stop_task (pad);
} }
break; break;
default: default:
result = TRUE;
break; break;
} }
}
if (result) if (result)
parse->priv->pad_mode = active ? mode : GST_PAD_MODE_NONE; parse->priv->pad_mode = active ? mode : GST_PAD_MODE_NONE;
GST_DEBUG_OBJECT (parse, "sink activate return: %d", result); GST_DEBUG_OBJECT (parse, "sink activate return: %d", result);
return result; return result;
/* ERRORS */
activate_failed:
{
GST_DEBUG_OBJECT (parse, "activate failed");
return FALSE;
}
} }
/** /**