summaryrefslogtreecommitdiffstats
path: root/ext/gconf
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-05-03 09:18:22 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-05-03 09:18:22 +0000
commit24e21ae6e9d0cc81b5fb93668848437e6a851df9 (patch)
tree755e37a240fb7294865ff7638dc2c6b08b78f6af /ext/gconf
parent34f916abbd9284552603810e3a0d4abf3e831dbd (diff)
ext/gconf/: When we can't create a fakesink/fakesrc complain instead of unreffing
Original commit message from CVS: * ext/gconf/gstgconfaudiosrc.c: (gst_gconf_audio_src_reset), (gst_gconf_audio_src_change_state): * ext/gconf/gstgconfvideosink.c: (gst_gconf_video_sink_reset), (gst_gconf_video_sink_change_state): * ext/gconf/gstgconfvideosrc.c: (gst_gconf_video_src_reset), (gst_gconf_video_src_change_state): * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), (gst_switch_commit_new_kid), (gst_switch_sink_change_state): When we can't create a fakesink/fakesrc complain instead of unreffing NULL pointers and crashing later. See bug #530535.
Diffstat (limited to 'ext/gconf')
-rw-r--r--ext/gconf/gstgconfaudiosrc.c10
-rw-r--r--ext/gconf/gstgconfvideosink.c11
-rw-r--r--ext/gconf/gstgconfvideosrc.c11
-rw-r--r--ext/gconf/gstswitchsink.c13
4 files changed, 36 insertions, 9 deletions
diff --git a/ext/gconf/gstgconfaudiosrc.c b/ext/gconf/gstgconfaudiosrc.c
index b9379c4c..589cf6af 100644
--- a/ext/gconf/gstgconfaudiosrc.c
+++ b/ext/gconf/gstgconfaudiosrc.c
@@ -71,7 +71,7 @@ gst_gconf_audio_src_class_init (GstGConfAudioSrcClass * klass)
* Hack to make negotiation work.
*/
-static void
+static gboolean
gst_gconf_audio_src_reset (GstGConfAudioSrc * src)
{
GstPad *targetpad;
@@ -82,6 +82,10 @@ gst_gconf_audio_src_reset (GstGConfAudioSrc * src)
gst_bin_remove (GST_BIN (src), src->kid);
}
src->kid = gst_element_factory_make ("fakesrc", "testsrc");
+ if (!src->kid) {
+ GST_ERROR_OBJECT (src, "Failed to create fakesrc");
+ return FALSE;
+ }
gst_bin_add (GST_BIN (src), src->kid);
targetpad = gst_element_get_pad (src->kid, "src");
@@ -90,6 +94,7 @@ gst_gconf_audio_src_reset (GstGConfAudioSrc * src)
g_free (src->gconf_str);
src->gconf_str = NULL;
+ return TRUE;
}
static void
@@ -225,7 +230,8 @@ gst_gconf_audio_src_change_state (GstElement * element,
switch (transition) {
case GST_STATE_CHANGE_READY_TO_NULL:
- gst_gconf_audio_src_reset (src);
+ if (!gst_gconf_audio_src_reset (src))
+ ret = GST_STATE_CHANGE_FAILURE;
break;
default:
break;
diff --git a/ext/gconf/gstgconfvideosink.c b/ext/gconf/gstgconfvideosink.c
index e22791db..1e7c16e6 100644
--- a/ext/gconf/gstgconfvideosink.c
+++ b/ext/gconf/gstgconfvideosink.c
@@ -70,7 +70,7 @@ gst_gconf_video_sink_class_init (GstGConfVideoSinkClass * klass)
* Hack to make negotiation work.
*/
-static void
+static gboolean
gst_gconf_video_sink_reset (GstGConfVideoSink * sink)
{
GstPad *targetpad;
@@ -81,6 +81,10 @@ gst_gconf_video_sink_reset (GstGConfVideoSink * sink)
gst_bin_remove (GST_BIN (sink), sink->kid);
}
sink->kid = gst_element_factory_make ("fakesink", "testsink");
+ if (!sink->kid) {
+ GST_ERROR_OBJECT (sink, "Failed to create fakesink");
+ return FALSE;
+ }
gst_bin_add (GST_BIN (sink), sink->kid);
targetpad = gst_element_get_pad (sink->kid, "sink");
@@ -89,6 +93,8 @@ gst_gconf_video_sink_reset (GstGConfVideoSink * sink)
g_free (sink->gconf_str);
sink->gconf_str = NULL;
+
+ return TRUE;
}
static void
@@ -223,7 +229,8 @@ gst_gconf_video_sink_change_state (GstElement * element,
switch (transition) {
case GST_STATE_CHANGE_READY_TO_NULL:
- gst_gconf_video_sink_reset (sink);
+ if (!gst_gconf_video_sink_reset (sink))
+ ret = GST_STATE_CHANGE_FAILURE;
break;
default:
break;
diff --git a/ext/gconf/gstgconfvideosrc.c b/ext/gconf/gstgconfvideosrc.c
index 2735a901..5d5fcb11 100644
--- a/ext/gconf/gstgconfvideosrc.c
+++ b/ext/gconf/gstgconfvideosrc.c
@@ -71,7 +71,7 @@ gst_gconf_video_src_class_init (GstGConfVideoSrcClass * klass)
* Hack to make negotiation work.
*/
-static void
+static gboolean
gst_gconf_video_src_reset (GstGConfVideoSrc * src)
{
GstPad *targetpad;
@@ -82,6 +82,10 @@ gst_gconf_video_src_reset (GstGConfVideoSrc * src)
gst_bin_remove (GST_BIN (src), src->kid);
}
src->kid = gst_element_factory_make ("fakesrc", "testsrc");
+ if (!src->kid) {
+ GST_ERROR_OBJECT (src, "Failed to create fakesrc");
+ return FALSE;
+ }
gst_bin_add (GST_BIN (src), src->kid);
targetpad = gst_element_get_pad (src->kid, "src");
@@ -90,6 +94,8 @@ gst_gconf_video_src_reset (GstGConfVideoSrc * src)
g_free (src->gconf_str);
src->gconf_str = NULL;
+
+ return TRUE;
}
static void
@@ -217,7 +223,8 @@ gst_gconf_video_src_change_state (GstElement * element,
switch (transition) {
case GST_STATE_CHANGE_READY_TO_NULL:
- gst_gconf_video_src_reset (src);
+ if (!gst_gconf_video_src_reset (src))
+ ret = GST_STATE_CHANGE_FAILURE;
break;
default:
break;
diff --git a/ext/gconf/gstswitchsink.c b/ext/gconf/gstswitchsink.c
index d8da2ae0..6c9fff17 100644
--- a/ext/gconf/gstswitchsink.c
+++ b/ext/gconf/gstswitchsink.c
@@ -76,15 +76,17 @@ gst_switch_sink_class_init (GstSwitchSinkClass * klass)
}
}
-static void
+static gboolean
gst_switch_sink_reset (GstSwitchSink * sink)
{
/* this will install fakesink if no other child has been set,
* otherwise we rely on the subclass to know when to unset its
* custom kid */
if (sink->kid == NULL) {
- gst_switch_sink_set_child (sink, NULL);
+ return gst_switch_sink_set_child (sink, NULL);
}
+
+ return TRUE;
}
static void
@@ -143,6 +145,10 @@ gst_switch_commit_new_kid (GstSwitchSink * sink)
if (new_kid == NULL) {
GST_DEBUG_OBJECT (sink, "Replacing kid with fakesink");
new_kid = gst_element_factory_make ("fakesink", "testsink");
+ if (new_kid == NULL) {
+ GST_ERROR_OBJECT (sink, "Failed to create fakesink");
+ return FALSE;
+ }
/* Add a reference, as it would if the element came from sink->new_kid */
gst_object_ref (new_kid);
g_object_set (new_kid, "sync", TRUE, NULL);
@@ -299,7 +305,8 @@ gst_switch_sink_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_READY_TO_NULL:
- gst_switch_sink_reset (sink);
+ if (!gst_switch_sink_reset (sink))
+ ret = GST_STATE_CHANGE_FAILURE;
break;
default:
break;