summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2011-08-30 15:17:04 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2011-08-30 15:17:04 +0100
commitab30a2b758d3635b550958e2b95847b7a800a080 (patch)
tree5f44b383a0e933b721320d416c9a9eddf61e6c69
parentd131121b7f92cd45f073b72f5cb8f72337c04165 (diff)
downloadclutter-gst-ab30a2b758d3635b550958e2b95847b7a800a080.tar.gz
video-player: Actually implement clutter_gst_player_deinit()
When ClutterGstPlayer has been split out, the deinit() code was forgotten. It's back in with test-video-texture-new-unref-loop showing 0 leak. Yeah!
-rw-r--r--clutter-gst/clutter-gst-player.c68
-rw-r--r--clutter-gst/clutter-gst-player.h1
-rw-r--r--clutter-gst/clutter-gst-video-texture.c2
-rw-r--r--doc/reference/clutter-gst-sections.txt1
4 files changed, 51 insertions, 21 deletions
diff --git a/clutter-gst/clutter-gst-player.c b/clutter-gst/clutter-gst-player.c
index 9ee06db..944cf92 100644
--- a/clutter-gst/clutter-gst-player.c
+++ b/clutter-gst/clutter-gst-player.c
@@ -121,7 +121,6 @@ struct _ClutterGstPlayerIfacePrivate
guint property_id,
GValue *value,
GParamSpec *pspec);
- void (*dispose) (GObject *object);
};
typedef struct _ClutterGstPlayerPrivate ClutterGstPlayerPrivate;
@@ -1348,23 +1347,6 @@ on_current_text_changed (GstElement *pipeline,
/* GObject's magic/madness */
static void
-clutter_gst_player_deinit (ClutterGstPlayer *player)
-{
- /* TODO */
-}
-
-static void
-clutter_gst_player_dispose (GObject *object)
-{
- ClutterGstPlayer *player = CLUTTER_GST_PLAYER (object);
- ClutterGstPlayerIfacePrivate *iface_priv = PLAYER_GET_CLASS_PRIVATE (object);
-
- clutter_gst_player_deinit (player);
-
- iface_priv->dispose (object);
-}
-
-static void
clutter_gst_player_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -1535,7 +1517,7 @@ clutter_gst_player_get_property (GObject *object,
* @object_class: a #GObjectClass
*
* Adds the #ClutterGstPlayer properties to a class and surchages the
- * set/get_property and dispose of #GObjectClass. You should call this
+ * set/get_property of #GObjectClass. You should call this
* function at the end of the class_init method of the class
* implementing #ClutterGstPlayer.
*
@@ -1554,10 +1536,8 @@ clutter_gst_player_class_init (GObjectClass *object_class)
/* Save object's methods we want to override */
priv->set_property = object_class->set_property;
priv->get_property = object_class->get_property;
- priv->dispose = object_class->dispose;
/* Replace by our methods */
- object_class->dispose = clutter_gst_player_dispose;
object_class->set_property = clutter_gst_player_set_property;
object_class->get_property = clutter_gst_player_get_property;
@@ -1645,6 +1625,10 @@ get_pipeline (void)
* function at the beginning of the init method of the class
* implementing #ClutterGstPlayer.
*
+ * When you're finished with the ClutterGstPlayer mixin features (usually in
+ * the dispose or finalize vfuncs), call clutter_gst_player_deinit() to
+ * desallocate the resources created by clutter_gst_player_init().
+ *
* Return value: TRUE if the initialization was successfull, FALSE otherwise.
*
* Since: 1.4
@@ -1736,6 +1720,48 @@ clutter_gst_player_init (ClutterGstPlayer *player)
return TRUE;
}
+/**
+ * clutter_gst_player_deinit:
+ * @player: a #ClutterGstPlayer
+ *
+ * Frees the resources created by clutter_gst_player_init(). After
+ * clutter_gst_player_deinit() has been called, no other player method can be
+ * called on the instance.
+ *
+ * Since: 1.4
+ */
+void
+clutter_gst_player_deinit (ClutterGstPlayer *player)
+{
+ ClutterGstPlayerPrivate *priv;
+
+ g_return_if_fail (CLUTTER_GST_IS_PLAYER (player));
+
+ priv = PLAYER_GET_PRIVATE (player);
+
+ /* start by doing the usual clean up when not wanting to play an URI */
+ set_uri (player, NULL);
+
+ if (priv->bus)
+ {
+ gst_bus_remove_signal_watch (priv->bus);
+ priv->bus = NULL;
+ }
+
+ if (priv->pipeline)
+ {
+ gst_object_unref (GST_OBJECT (priv->pipeline));
+ priv->pipeline = NULL;
+ }
+
+ g_free (priv->uri);
+ g_free (priv->font_name);
+ free_string_list (&priv->audio_streams);
+ free_string_list (&priv->subtitle_tracks);
+
+ g_slice_free (ClutterGstPlayerPrivate, priv);
+}
+
static void
clutter_gst_player_default_init (ClutterGstPlayerIface *iface)
{
diff --git a/clutter-gst/clutter-gst-player.h b/clutter-gst/clutter-gst-player.h
index 91fa55c..bee442c 100644
--- a/clutter-gst/clutter-gst-player.h
+++ b/clutter-gst/clutter-gst-player.h
@@ -97,6 +97,7 @@ GType clutter_gst_player_get_type (void) G_GNUC_CONST;
void clutter_gst_player_class_init (GObjectClass *object_class);
gboolean clutter_gst_player_init (ClutterGstPlayer *player);
+void clutter_gst_player_deinit (ClutterGstPlayer *player);
GstElement * clutter_gst_player_get_pipeline (ClutterGstPlayer *player);
diff --git a/clutter-gst/clutter-gst-video-texture.c b/clutter-gst/clutter-gst-video-texture.c
index 0ec9cbf..f7193c0 100644
--- a/clutter-gst/clutter-gst-video-texture.c
+++ b/clutter-gst/clutter-gst-video-texture.c
@@ -420,6 +420,8 @@ clutter_gst_video_texture_finalize (GObject *object)
self = CLUTTER_GST_VIDEO_TEXTURE (object);
priv = self->priv;
+ clutter_gst_player_deinit (CLUTTER_GST_PLAYER (self));
+
if (priv->idle_material != COGL_INVALID_HANDLE)
cogl_handle_unref (priv->idle_material);
diff --git a/doc/reference/clutter-gst-sections.txt b/doc/reference/clutter-gst-sections.txt
index bd7a710..3c2fef8 100644
--- a/doc/reference/clutter-gst-sections.txt
+++ b/doc/reference/clutter-gst-sections.txt
@@ -17,6 +17,7 @@ ClutterGstPlayer
ClutterGstPlayerIface
clutter_gst_player_class_init
clutter_gst_player_init
+clutter_gst_player_deinit
clutter_gst_player_get_pipeline
clutter_gst_player_get_idle
clutter_gst_player_get_user_agent