From: Sebastian Dröge Date: Sun, 4 Jul 2010 14:57:55 +0000 (+0200) Subject: gconf: Fix ref handling of new child elements and minor cleanup X-Git-Tag: 1.19.3~509^2~8336 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f25420323a72e5ad08743849a26bcaaafb11ad6a;p=platform%2Fupstream%2Fgstreamer.git gconf: Fix ref handling of new child elements and minor cleanup --- diff --git a/ext/gconf/gstswitchsink.c b/ext/gconf/gstswitchsink.c index b62ba00..1fccf68 100644 --- a/ext/gconf/gstswitchsink.c +++ b/ext/gconf/gstswitchsink.c @@ -1,7 +1,7 @@ /* GStreamer - * (c) 2005 Ronald S. Bultje - * (c) 2006 Jürg Billeter - * (c) 2007 Jan Schmidt + * Copyright (c) 2005 Ronald S. Bultje + * Copyright (c) 2006 Jürg Billeter + * Copyright (c) 2007 Jan Schmidt * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -118,7 +118,7 @@ gst_switch_sink_dispose (GObject * object) } static gboolean -gst_switch_commit_new_kid (GstSwitchSink * sink) +gst_switch_sink_commit_new_kid (GstSwitchSink * sink) { GstPad *targetpad; GstState kid_state; @@ -136,7 +136,7 @@ gst_switch_commit_new_kid (GstSwitchSink * sink) else kid_state = GST_STATE (sink); - new_kid = sink->new_kid; + new_kid = sink->new_kid ? gst_object_ref (sink->new_kid) : NULL; sink->new_kid = NULL; GST_OBJECT_UNLOCK (sink); @@ -175,8 +175,6 @@ gst_switch_commit_new_kid (GstSwitchSink * sink) GST_INFO_OBJECT (sink, "Forwarding kid error: %" GST_PTR_FORMAT, msg); gst_element_post_message (GST_ELEMENT (sink), msg); } - /* FIXME: need a translated error message that tells the user to check - * her GConf audio/video settings */ GST_ELEMENT_ERROR (sink, CORE, STATE_CHANGE, (NULL), ("Failed to set state on new child.")); gst_element_set_bus (new_kid, NULL); @@ -213,12 +211,6 @@ gst_switch_commit_new_kid (GstSwitchSink * sink) /* FIXME: Push new-segment info and pre-roll buffer(s) into the kid */ - /* Unblock the target pad if necessary */ - if (sink->awaiting_block) { - gst_pad_set_blocked (sink->pad, FALSE); - sink->awaiting_block = FALSE; - } - return TRUE; } @@ -239,6 +231,8 @@ gst_switch_sink_set_child (GstSwitchSink * sink, GstElement * new_kid) p_kid = &sink->new_kid; gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); GST_OBJECT_UNLOCK (sink); + if (new_kid) + gst_object_unref (new_kid); /* Sometime, it would be lovely to allow sink changes even when * already running, but this involves sending an appropriate new-segment @@ -251,7 +245,7 @@ gst_switch_sink_set_child (GstSwitchSink * sink, GstElement * new_kid) return TRUE; } - return gst_switch_commit_new_kid (sink); + return gst_switch_sink_commit_new_kid (sink); } static GstStateChangeReturn diff --git a/ext/gconf/gstswitchsink.h b/ext/gconf/gstswitchsink.h index c85c90b..556e755 100644 --- a/ext/gconf/gstswitchsink.h +++ b/ext/gconf/gstswitchsink.h @@ -1,6 +1,6 @@ /* GStreamer - * (c) 2005 Ronald S. Bultje - * (c) 2007 Jan Schmidt + * Copyright (c) 2005 Ronald S. Bultje + * Copyright (c) 2007 Jan Schmidt * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -45,14 +45,8 @@ typedef struct _GstSwitchSink { GstElement *new_kid; GstPad *pad; - /* Track incoming segment info for switchover */ - GstSegment segment; - /* If a custom child has been set... */ gboolean have_kid; - - /* If waiting for a pad block to complete on the ghost pad */ - gboolean awaiting_block; } GstSwitchSink; typedef struct _GstSwitchSinkClass { diff --git a/ext/gconf/gstswitchsrc.c b/ext/gconf/gstswitchsrc.c index cd35db9..61ab31f 100644 --- a/ext/gconf/gstswitchsrc.c +++ b/ext/gconf/gstswitchsrc.c @@ -112,7 +112,7 @@ gst_switch_src_dispose (GObject * object) } static gboolean -gst_switch_commit_new_kid (GstSwitchSrc * src) +gst_switch_src_commit_new_kid (GstSwitchSrc * src) { GstPad *targetpad; GstState kid_state; @@ -130,7 +130,7 @@ gst_switch_commit_new_kid (GstSwitchSrc * src) else kid_state = GST_STATE (src); - new_kid = src->new_kid; + new_kid = src->new_kid ? gst_object_ref (src->new_kid) : NULL; src->new_kid = NULL; GST_OBJECT_UNLOCK (src); @@ -168,8 +168,6 @@ gst_switch_commit_new_kid (GstSwitchSrc * src) GST_INFO_OBJECT (src, "Forwarding kid error: %" GST_PTR_FORMAT, msg); gst_element_post_message (GST_ELEMENT (src), msg); } - /* FIXME: need a translated error message that tells the user to check - * her GConf audio/video settings */ GST_ELEMENT_ERROR (src, CORE, STATE_CHANGE, (NULL), ("Failed to set state on new child.")); gst_element_set_bus (new_kid, NULL); @@ -193,8 +191,6 @@ gst_switch_commit_new_kid (GstSwitchSrc * src) gst_element_set_state (old_kid, GST_STATE_NULL); gst_bin_remove (GST_BIN (src), old_kid); gst_object_unref (old_kid); - /* Don't lose the SINK flag */ - GST_OBJECT_FLAG_SET (src, GST_ELEMENT_IS_SINK); } /* re-attach ghostpad */ @@ -204,12 +200,6 @@ gst_switch_commit_new_kid (GstSwitchSrc * src) gst_object_unref (targetpad); GST_DEBUG_OBJECT (src, "done changing child of switchsrc"); - /* Unblock the target pad if necessary */ - if (src->awaiting_block) { - gst_pad_set_blocked (src->pad, FALSE); - src->awaiting_block = FALSE; - } - return TRUE; } @@ -230,6 +220,8 @@ gst_switch_src_set_child (GstSwitchSrc * src, GstElement * new_kid) p_kid = &src->new_kid; gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); GST_OBJECT_UNLOCK (src); + if (new_kid) + gst_object_unref (new_kid); /* Sometime, it would be lovely to allow src changes even when * already running */ @@ -241,7 +233,7 @@ gst_switch_src_set_child (GstSwitchSrc * src, GstElement * new_kid) return TRUE; } - return gst_switch_commit_new_kid (src); + return gst_switch_src_commit_new_kid (src); } static GstStateChangeReturn diff --git a/ext/gconf/gstswitchsrc.h b/ext/gconf/gstswitchsrc.h index 4b93f93..6c550ad 100644 --- a/ext/gconf/gstswitchsrc.h +++ b/ext/gconf/gstswitchsrc.h @@ -43,9 +43,6 @@ typedef struct _GstSwitchSrc { /* If a custom child has been set... */ gboolean have_kid; - - /* If waiting for a pad block to complete on the ghost pad */ - gboolean awaiting_block; } GstSwitchSrc; typedef struct _GstSwitchSrcClass {