summaryrefslogtreecommitdiffstats
path: root/ext/gio
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2007-11-07 11:48:09 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2007-11-07 11:48:09 +0000
commit3b310c00eb22d59e2a19d84707c4d8f7dec5b434 (patch)
tree2e2a70f4bc4e80c2fe254955f41c1485ff3f1b13 /ext/gio
parent1407259dbc44b0cf23c9e72770c990e5f8cac680 (diff)
downloadgst-plugins-bad-3b310c00eb22d59e2a19d84707c4d8f7dec5b434.tar.gz
gst-plugins-bad-3b310c00eb22d59e2a19d84707c4d8f7dec5b434.tar.bz2
gst-plugins-bad-3b310c00eb22d59e2a19d84707c4d8f7dec5b434.zip
ext/gio/gstgio.c: Remove nowadays unnecessary workaround for a crash.
Original commit message from CVS: * ext/gio/gstgio.c: (plugin_init): Remove nowadays unnecessary workaround for a crash. * ext/gio/gstgiosink.c: (gst_gio_sink_finalize), (gst_gio_sink_start), (gst_gio_sink_stop), (gst_gio_sink_unlock_stop): * ext/gio/gstgiosink.h: * ext/gio/gstgiosrc.c: (gst_gio_src_finalize), (gst_gio_src_start), (gst_gio_src_stop), (gst_gio_src_unlock_stop): * ext/gio/gstgiosrc.h: Make the finalize function safer, clean up everything that could stay around. Reset the cancellable instead of creating a new one after cancelling some operation. Don't store the GFile in the element, it's only necessary for creating the streams.
Diffstat (limited to 'ext/gio')
-rw-r--r--ext/gio/gstgio.c7
-rw-r--r--ext/gio/gstgiosink.c41
-rw-r--r--ext/gio/gstgiosink.h1
-rw-r--r--ext/gio/gstgiosrc.c39
-rw-r--r--ext/gio/gstgiosrc.h1
5 files changed, 41 insertions, 48 deletions
diff --git a/ext/gio/gstgio.c b/ext/gio/gstgio.c
index 440ca01c..978394a9 100644
--- a/ext/gio/gstgio.c
+++ b/ext/gio/gstgio.c
@@ -189,13 +189,6 @@ plugin_init (GstPlugin * plugin)
GST_DEBUG_CATEGORY_INIT (gst_gio_debug, "gio", 0, "GIO elements");
- /* FIXME: This is needed to prevent a crash. Needs further investigation
- * probably. */
- if (g_vfs_get_default () == NULL) {
- GST_WARNING ("Failed to initialize default VFS, not registering plugin");
- return FALSE;
- }
-
/* FIXME: Rank is MARGINAL for now, should be at least SECONDARY+1 in the future
* to replace gnomevfssink/src. For testing purposes PRIMARY+1 one makes sense
* so it gets autoplugged and preferred over filesrc/sink. */
diff --git a/ext/gio/gstgiosink.c b/ext/gio/gstgiosink.c
index a676ea6a..8929bd9d 100644
--- a/ext/gio/gstgiosink.c
+++ b/ext/gio/gstgiosink.c
@@ -135,12 +135,20 @@ gst_gio_sink_finalize (GObject * object)
{
GstGioSink *sink = GST_GIO_SINK (object);
- g_object_unref (sink->cancel);
+ if (sink->cancel) {
+ g_object_unref (sink->cancel);
+ sink->cancel = NULL;
+ }
- if (sink->file)
- g_object_unref (sink->file);
+ if (sink->stream) {
+ g_object_unref (sink->stream);
+ sink->stream = NULL;
+ }
- g_free (sink->location);
+ if (sink->location) {
+ g_free (sink->location);
+ sink->location = NULL;
+ }
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
@@ -186,6 +194,7 @@ static gboolean
gst_gio_sink_start (GstBaseSink * base_sink)
{
GstGioSink *sink = GST_GIO_SINK (base_sink);
+ GFile *file;
gboolean success;
GError *err = NULL;
@@ -195,18 +204,20 @@ gst_gio_sink_start (GstBaseSink * base_sink)
return FALSE;
}
- sink->file = g_file_new_for_uri (sink->location);
+ file = g_file_new_for_uri (sink->location);
- if (sink->file == NULL) {
+ if (file == NULL) {
GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
("Malformed URI or protocol not supported (%s)", sink->location));
return FALSE;
}
sink->stream =
- g_file_create (sink->file, G_FILE_CREATE_FLAGS_NONE, sink->cancel, &err);
+ g_file_create (file, G_FILE_CREATE_FLAGS_NONE, sink->cancel, &err);
success = (sink->stream != NULL);
+ g_object_unref (file);
+
if (!success && !gst_gio_error (sink, "g_file_create", &err, NULL)) {
/*if (GST_GIO_ERROR_MATCHES (err, EXISTS)) */
@@ -224,12 +235,8 @@ gst_gio_sink_start (GstBaseSink * base_sink)
g_clear_error (&err);
}
- if (!success) {
- g_object_unref (sink->file);
- sink->file = NULL;
-
+ if (!success)
return FALSE;
- }
sink->position = 0;
@@ -245,11 +252,6 @@ gst_gio_sink_stop (GstBaseSink * base_sink)
gboolean success = TRUE;
GError *err = NULL;
- if (sink->file != NULL) {
- g_object_unref (sink->file);
- sink->file = NULL;
- }
-
if (sink->stream != NULL) {
/* FIXME: In case that the call below would block, there is no one to
* trigger the cancellation! */
@@ -289,10 +291,9 @@ gst_gio_sink_unlock_stop (GstBaseSink * base_sink)
{
GstGioSink *sink = GST_GIO_SINK (base_sink);
- GST_LOG_OBJECT (sink, "restoring cancellable");
+ GST_LOG_OBJECT (sink, "resetting cancellable");
- g_object_unref (sink->cancel);
- sink->cancel = g_cancellable_new ();
+ g_cancellable_reset (sink->cancel);
return TRUE;
}
diff --git a/ext/gio/gstgiosink.h b/ext/gio/gstgiosink.h
index 474f7cfd..a9bdbed8 100644
--- a/ext/gio/gstgiosink.h
+++ b/ext/gio/gstgiosink.h
@@ -53,7 +53,6 @@ struct _GstGioSink
/*< private >*/
GCancellable *cancel;
- GFile *file;
gchar *location;
guint64 position;
GFileOutputStream *stream;
diff --git a/ext/gio/gstgiosrc.c b/ext/gio/gstgiosrc.c
index 15e0b9d2..e984e143 100644
--- a/ext/gio/gstgiosrc.c
+++ b/ext/gio/gstgiosrc.c
@@ -128,12 +128,20 @@ gst_gio_src_finalize (GObject * object)
{
GstGioSrc *src = GST_GIO_SRC (object);
- g_object_unref (src->cancel);
+ if (src->cancel) {
+ g_object_unref (src->cancel);
+ src->cancel = NULL;
+ }
- if (src->file)
- g_object_unref (src->file);
+ if (src->stream) {
+ g_object_unref (src->stream);
+ src->stream = NULL;
+ }
- g_free (src->location);
+ if (src->location) {
+ g_free (src->location);
+ src->location = NULL;
+ }
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
@@ -179,6 +187,7 @@ static gboolean
gst_gio_src_start (GstBaseSrc * base_src)
{
GstGioSrc *src = GST_GIO_SRC (base_src);
+ GFile *file;
GError *err = NULL;
if (src->location == NULL) {
@@ -186,15 +195,17 @@ gst_gio_src_start (GstBaseSrc * base_src)
return FALSE;
}
- src->file = g_file_new_for_uri (src->location);
+ file = g_file_new_for_uri (src->location);
- if (src->file == NULL) {
+ if (file == NULL) {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
("Malformed URI or protocol not supported (%s)", src->location));
return FALSE;
}
- src->stream = g_file_read (src->file, src->cancel, &err);
+ src->stream = g_file_read (file, src->cancel, &err);
+
+ g_object_unref (file);
if (src->stream == NULL && !gst_gio_error (src, "g_file_read", &err, NULL)) {
@@ -209,13 +220,9 @@ gst_gio_src_start (GstBaseSrc * base_src)
g_clear_error (&err);
- g_object_unref (src->file);
- src->file = NULL;
-
return FALSE;
} else if (src->stream == NULL) {
- g_object_unref (src->file);
return FALSE;
}
@@ -250,11 +257,6 @@ gst_gio_src_stop (GstBaseSrc * base_src)
src->stream = NULL;
}
- if (src->file != NULL) {
- g_object_unref (src->file);
- src->file = NULL;
- }
-
GST_DEBUG_OBJECT (src, "closed location %s", src->location);
return success;
@@ -321,10 +323,9 @@ gst_gio_src_unlock_stop (GstBaseSrc * base_src)
{
GstGioSrc *src = GST_GIO_SRC (base_src);
- GST_LOG_OBJECT (src, "restoring cancellable");
+ GST_LOG_OBJECT (src, "resetting cancellable");
- g_object_unref (src->cancel);
- src->cancel = g_cancellable_new ();
+ g_cancellable_reset (src->cancel);
return TRUE;
}
diff --git a/ext/gio/gstgiosrc.h b/ext/gio/gstgiosrc.h
index dfed9cde..7fcfaaed 100644
--- a/ext/gio/gstgiosrc.h
+++ b/ext/gio/gstgiosrc.h
@@ -53,7 +53,6 @@ struct _GstGioSrc
/*< private >*/
GCancellable *cancel;
- GFile *file;
gchar *location;
guint64 position;
GFileInputStream *stream;