summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2012-02-15 12:19:13 +0100
committerWim Taymans <wim.taymans@collabora.co.uk>2012-02-15 12:19:13 +0100
commitb6b239ceaabe79580d1e84c575eb5a296f4b6cc0 (patch)
tree3826cedb837253a57e3b02748c1e9799775ec09f
parent592ead764c72cbbc35cb2925a394480286404b79 (diff)
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.
-rw-r--r--libs/gst/base/gstbaseparse.c72
1 files changed, 40 insertions, 32 deletions
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index e1d0c6cf6..f5ffc3b8b 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -3013,7 +3013,6 @@ static gboolean
gst_base_parse_sink_activate (GstPad * sinkpad, GstObject * parent)
{
GstBaseParse *parse;
- gboolean result = TRUE;
GstQuery *query;
gboolean pull_mode;
@@ -3022,24 +3021,29 @@ gst_base_parse_sink_activate (GstPad * sinkpad, GstObject * parent)
GST_DEBUG_OBJECT (parse, "sink activate");
query = gst_query_new_scheduling ();
- result = gst_pad_peer_query (sinkpad, query);
- if (result) {
- pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL);
- } else {
- pull_mode = FALSE;
+ if (!gst_pad_peer_query (sinkpad, query)) {
+ gst_query_unref (query);
+ goto baseparse_push;
}
+
+ pull_mode = gst_query_has_scheduling_mode (query, GST_PAD_MODE_PULL);
gst_query_unref (query);
- if (pull_mode) {
- GST_DEBUG_OBJECT (parse, "trying to activate in pull mode");
- result = gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PULL, TRUE);
- } else {
+ if (!pull_mode)
+ goto baseparse_push;
+
+ GST_DEBUG_OBJECT (parse, "trying to activate in pull mode");
+ 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");
- result = gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
+ return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
}
-
- GST_DEBUG_OBJECT (parse, "sink activate return %d", result);
- return result;
}
static gboolean
@@ -3078,31 +3082,28 @@ static gboolean
gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent,
GstPadMode mode, gboolean active)
{
- gboolean result = TRUE;
+ gboolean result;
GstBaseParse *parse;
parse = GST_BASE_PARSE (parent);
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) {
- case GST_PAD_MODE_PULL:
- if (active) {
- parse->priv->pending_segment =
- gst_event_new_segment (&parse->segment);
- result &=
- gst_pad_start_task (pad, (GstTaskFunction) gst_base_parse_loop,
- pad);
- } else {
- result &= gst_pad_stop_task (pad);
- }
- break;
- default:
- break;
- }
+ switch (mode) {
+ case GST_PAD_MODE_PULL:
+ if (active) {
+ parse->priv->pending_segment = gst_event_new_segment (&parse->segment);
+ result = TRUE;
+ } else {
+ result = gst_pad_stop_task (pad);
+ }
+ break;
+ default:
+ result = TRUE;
+ break;
}
if (result)
parse->priv->pad_mode = active ? mode : GST_PAD_MODE_NONE;
@@ -3110,6 +3111,13 @@ gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent,
GST_DEBUG_OBJECT (parse, "sink activate return: %d", result);
return result;
+
+ /* ERRORS */
+activate_failed:
+ {
+ GST_DEBUG_OBJECT (parse, "activate failed");
+ return FALSE;
+ }
}
/**