diff options
author | Damien Lespiau <damien.lespiau@intel.com> | 2011-08-30 15:17:04 +0100 |
---|---|---|
committer | Damien Lespiau <damien.lespiau@intel.com> | 2011-08-30 15:17:04 +0100 |
commit | ab30a2b758d3635b550958e2b95847b7a800a080 (patch) | |
tree | 5f44b383a0e933b721320d416c9a9eddf61e6c69 | |
parent | d131121b7f92cd45f073b72f5cb8f72337c04165 (diff) | |
download | clutter-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.c | 68 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-player.h | 1 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-video-texture.c | 2 | ||||
-rw-r--r-- | doc/reference/clutter-gst-sections.txt | 1 |
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 |