gst/playback/: Set state to NULL before removing from bin. Fix refcounting.

Original commit message from CVS:
* gst/playback/gstplaybasebin.c: (group_destroy),
(gen_preroll_element), (remove_groups), (setup_source):
* gst/playback/gstplaybin.c: (remove_sinks), (add_sink),
(setup_sinks), (gst_play_bin_send_event),
(gst_play_bin_change_state):
Set state to NULL before removing from bin. Fix refcounting.
This commit is contained in:
Michael Smith 2005-10-04 18:02:00 +00:00
parent b0f967265a
commit 13331c4636
3 changed files with 30 additions and 3 deletions

View file

@ -1,3 +1,12 @@
2005-10-04 Michael Smith <msmith@fluendo.com>
* gst/playback/gstplaybasebin.c: (group_destroy),
(gen_preroll_element), (remove_groups), (setup_source):
* gst/playback/gstplaybin.c: (remove_sinks), (add_sink),
(setup_sinks), (gst_play_bin_send_event),
(gst_play_bin_change_state):
Set state to NULL before removing from bin. Fix refcounting.
2005-10-04 Michael Smith <msmith@fluendo.com>
* gst/playback/gstplaybin.c: (gst_play_bin_send_event):

View file

@ -312,6 +312,7 @@ group_destroy (GstPlayBaseGroup * group)
if (fakesrc != NULL) {
GST_LOG ("removing fakesrc from %s:%s",
GST_PAD_NAME (pad), GST_ELEMENT_NAME (gst_pad_get_parent (pad)));
gst_element_set_state (fakesrc, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_base_bin), fakesrc);
}
}
@ -320,10 +321,14 @@ group_destroy (GstPlayBaseGroup * group)
* from the thread */
if (get_active_group (play_base_bin) == group) {
GST_LOG ("removing preroll element %s", GST_ELEMENT_NAME (element));
gst_element_set_state (element, GST_STATE_NULL);
gst_element_set_state (group->type[n].selector, GST_STATE_NULL);
gst_bin_remove (group->type[n].bin, element);
gst_bin_remove (group->type[n].bin, group->type[n].selector);
} else {
/* else we can just unref it */
gst_element_set_state (element, GST_STATE_NULL);
gst_element_set_state (group->type[n].selector, GST_STATE_NULL);
gst_object_unref (element);
gst_object_unref (group->type[n].selector);
}
@ -620,10 +625,12 @@ gen_preroll_element (GstPlayBaseBin * play_base_bin,
gst_object_unref (preroll_pad);
/* add to group list */
/* FIXME refcount elements, after bin_add, object refs are invalid since
* it takes ownership. */
group->type[type - 1].selector = selector;
group->type[type - 1].preroll = preroll;
/* gst_bin_add takes ownership, so we need to take a ref beforehand */
gst_object_ref (preroll);
gst_object_ref (selector);
if (type == GST_STREAM_TYPE_TEXT && play_base_bin->subtitle) {
group->type[type - 1].bin = GST_BIN (play_base_bin->subtitle);
gst_bin_add (GST_BIN (play_base_bin->subtitle), selector);
@ -641,6 +648,9 @@ gen_preroll_element (GstPlayBaseBin * play_base_bin,
gst_element_set_state (preroll,
GST_STATE (play_base_bin) == GST_STATE_PLAYING ?
GST_STATE_PLAYING : GST_STATE_PAUSED);
gst_object_unref (preroll);
gst_object_unref (selector);
}
static void
@ -661,6 +671,7 @@ remove_groups (GstPlayBaseBin * play_base_bin)
/* clear subs */
if (play_base_bin->subtitle) {
gst_element_set_state (play_base_bin->subtitle, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_base_bin), play_base_bin->subtitle);
play_base_bin->subtitle = NULL;
}
@ -1142,6 +1153,7 @@ setup_source (GstPlayBaseBin * play_base_bin, gchar ** new_location)
/* remove the old decoder now, if any */
if (play_base_bin->decoder) {
GST_DEBUG_OBJECT (play_base_bin, "removing old decoder element");
gst_element_set_state (play_base_bin->decoder, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_base_bin), play_base_bin->decoder);
play_base_bin->decoder = NULL;
}

View file

@ -653,6 +653,7 @@ remove_sinks (GstPlayBin * play_bin)
* there is no unwanted state change when the parent
* is disposed */
play_bin->sinks = g_list_remove (play_bin->sinks, element);
gst_element_set_state (element, GST_STATE_NULL);
gst_bin_remove (GST_BIN (parent), element);
gst_object_unref (parent);
}
@ -671,6 +672,7 @@ remove_sinks (GstPlayBin * play_bin)
parent = gst_element_get_parent (element);
if (parent != NULL) {
play_bin->sinks = g_list_remove (play_bin->sinks, element);
gst_element_set_state (element, GST_STATE_NULL);
gst_bin_remove (GST_BIN (parent), element);
gst_object_unref (parent);
}
@ -701,6 +703,7 @@ remove_sinks (GstPlayBin * play_bin)
}
gst_object_unref (pad);
gst_element_set_state (element, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_bin), element);
}
g_list_free (play_bin->sinks);
@ -708,9 +711,9 @@ remove_sinks (GstPlayBin * play_bin)
/* FIXME: this is probably some refcounting problem */
if (play_bin->visualisation && GST_OBJECT_PARENT (play_bin->visualisation)) {
gst_element_set_state (play_bin->visualisation, GST_STATE_NULL);
gst_bin_remove (GST_BIN (GST_OBJECT_PARENT (play_bin->visualisation)),
play_bin->visualisation);
gst_element_set_state (play_bin->visualisation, GST_STATE_NULL);
}
if (play_bin->frame) {
@ -761,6 +764,7 @@ add_sink (GstPlayBin * play_bin, GstElement * sink, GstPad * srcpad)
g_warning ("could not link %s: %d", capsstr, res);
g_free (capsstr);
gst_element_set_state (sink, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_bin), sink);
} else {
/* we got the sink succesfully linked, now keep the sink
@ -848,6 +852,7 @@ setup_sinks (GstPlayBaseBin * play_base_bin, GstPlayBaseGroup * group)
/* remove the sinks now, pipeline get_state will now wait for the
* sinks to preroll */
if (play_bin->fakesink) {
gst_element_set_state (play_bin->fakesink, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_bin), play_bin->fakesink);
play_bin->fakesink = NULL;
}
@ -924,6 +929,7 @@ gst_play_bin_change_state (GstElement * element, GstStateChange transition)
remove_sinks (play_bin);
}
if (play_bin->fakesink) {
gst_element_set_state (play_bin->fakesink, GST_STATE_NULL);
gst_bin_remove (GST_BIN (play_bin), play_bin->fakesink);
play_bin->fakesink = NULL;
}