From 8e6b876e76c94410db160afe5eb30f21452e419f Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sun, 20 Feb 2011 23:39:41 -0800 Subject: [PATCH] Check that collectpads exists before removing pad The core now calls release pad from finalize, at which point the collectpads might have already been freed. --- ext/cairo/gsttextoverlay.c | 5 ++++- gst/avi/gstavimux.c | 5 ++++- gst/flv/gstflvmux.c | 5 ++++- gst/interleave/interleave.c | 4 +++- gst/matroska/matroska-mux.c | 5 ++++- gst/videomixer/videomixer.c | 5 ++++- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ext/cairo/gsttextoverlay.c b/ext/cairo/gsttextoverlay.c index 364b8ba..90e81a5 100644 --- a/ext/cairo/gsttextoverlay.c +++ b/ext/cairo/gsttextoverlay.c @@ -208,6 +208,7 @@ gst_text_overlay_finalize (GObject * object) gst_collect_pads_stop (overlay->collect); gst_object_unref (overlay->collect); + overlay->collect = NULL; g_free (overlay->text_fill_image); g_free (overlay->text_outline_image); @@ -631,7 +632,9 @@ gst_text_overlay_text_pad_unlinked (GstPad * pad) GST_DEBUG_OBJECT (overlay, "Text pad unlinked"); if (overlay->text_collect_data) { - gst_collect_pads_remove_pad (overlay->collect, overlay->text_sinkpad); + if (overlay->collect) { + gst_collect_pads_remove_pad (overlay->collect, overlay->text_sinkpad); + } overlay->text_collect_data = NULL; } diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c index d0d2f0e..1a8e576 100644 --- a/gst/avi/gstavimux.c +++ b/gst/avi/gstavimux.c @@ -285,6 +285,7 @@ gst_avi_mux_finalize (GObject * object) mux->idx = NULL; gst_object_unref (mux->collect); + mux->collect = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -1089,7 +1090,9 @@ gst_avi_mux_release_pad (GstElement * element, GstPad * pad) * as it also represent number of streams present */ avipad->collect = NULL; GST_DEBUG_OBJECT (avimux, "removed pad '%s'", GST_PAD_NAME (pad)); - gst_collect_pads_remove_pad (avimux->collect, pad); + if (avimux->collect) { + gst_collect_pads_remove_pad (avimux->collect, pad); + } gst_element_remove_pad (element, pad); /* if not started yet, we can remove any sign this pad ever existed */ /* in this case _start will take care of the real pad count */ diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c index 68a0df4..9d69ace 100644 --- a/gst/flv/gstflvmux.c +++ b/gst/flv/gstflvmux.c @@ -207,6 +207,7 @@ gst_flv_mux_finalize (GObject * object) GstFlvMux *mux = GST_FLV_MUX (object); gst_object_unref (mux->collect); + mux->collect = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -559,7 +560,9 @@ gst_flv_mux_release_pad (GstElement * element, GstPad * pad) if (cpad && cpad->video_codec_data) gst_buffer_unref (cpad->video_codec_data); - gst_collect_pads_remove_pad (mux->collect, pad); + if (mux->collect) { + gst_collect_pads_remove_pad (mux->collect, pad); + } gst_element_remove_pad (element, pad); } diff --git a/gst/interleave/interleave.c b/gst/interleave/interleave.c index 96a43c8..f6ff41a 100644 --- a/gst/interleave/interleave.c +++ b/gst/interleave/interleave.c @@ -598,7 +598,9 @@ gst_interleave_release_pad (GstElement * element, GstPad * pad) GST_OBJECT_UNLOCK (self->collect); - gst_collect_pads_remove_pad (self->collect, pad); + if (self->collect) { + gst_collect_pads_remove_pad (self->collect, pad); + } gst_element_remove_pad (element, pad); } diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index 31fe40b..6d2cc5d 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -385,6 +385,7 @@ gst_matroska_mux_finalize (GObject * object) GstMatroskaMux *mux = GST_MATROSKA_MUX (object); gst_object_unref (mux->collect); + mux->collect = NULL; gst_object_unref (mux->ebml_write); if (mux->writing_app) g_free (mux->writing_app); @@ -1929,7 +1930,9 @@ gst_matroska_mux_release_pad (GstElement * element, GstPad * pad) } } - gst_collect_pads_remove_pad (mux->collect, pad); + if (mux->collect) { + gst_collect_pads_remove_pad (mux->collect, pad); + } if (gst_element_remove_pad (element, pad)) mux->num_streams--; } diff --git a/gst/videomixer/videomixer.c b/gst/videomixer/videomixer.c index 1271d63..925b06c 100644 --- a/gst/videomixer/videomixer.c +++ b/gst/videomixer/videomixer.c @@ -777,6 +777,7 @@ gst_videomixer_finalize (GObject * object) GstVideoMixer *mix = GST_VIDEO_MIXER (object); gst_object_unref (mix->collect); + mix->collect = NULL; g_mutex_free (mix->state_lock); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -1251,7 +1252,9 @@ gst_videomixer_release_pad (GstElement * element, GstPad * pad) mix->sinkpads = g_slist_remove (mix->sinkpads, pad); gst_videomixer_collect_free (mixpad->mixcol); - gst_collect_pads_remove_pad (mix->collect, pad); + if (mix->collect) { + gst_collect_pads_remove_pad (mix->collect, pad); + } gst_child_proxy_child_removed (GST_OBJECT (mix), GST_OBJECT (mixpad)); /* determine possibly new geometry and master */ gst_videomixer_set_master_geometry (mix); -- 2.7.4