diff options
author | Damien Lespiau <damien.lespiau@intel.com> | 2011-10-27 19:18:34 +0100 |
---|---|---|
committer | Damien Lespiau <damien.lespiau@intel.com> | 2011-10-28 11:31:26 +0100 |
commit | 9f9ad6266c9e7cd870c86c8d5a346f9912cdad42 (patch) | |
tree | 0cf9ba3bb220968f8fd91125907d3aed3ddf4d3a | |
parent | c1015fe6762a6797446cc92572ac4efa0280c5d9 (diff) |
video-texture: Fix a circular dependency not breaking on unref()
VideoTexture -> GstPipeline -> VideoSink -> VideoTexture
Break the circular dependency by putting clutter_gst_player_deinit() in
the dispose.
This means that we need to make clutter_gst_player_deinit() idempotent
as well.
-rw-r--r-- | clutter-gst/clutter-gst-player.c | 27 | ||||
-rw-r--r-- | clutter-gst/clutter-gst-video-texture.c | 13 |
2 files changed, 36 insertions, 4 deletions
diff --git a/clutter-gst/clutter-gst-player.c b/clutter-gst/clutter-gst-player.c index 196c981..d7ba013 100644 --- a/clutter-gst/clutter-gst-player.c +++ b/clutter-gst/clutter-gst-player.c @@ -2016,8 +2016,30 @@ clutter_gst_player_deinit (ClutterGstPlayer *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 == NULL) + return; + + PLAYER_SET_PRIVATE (player, NULL); + + if (priv->tick_timeout_id) + { + g_source_remove (priv->tick_timeout_id); + priv->tick_timeout_id = 0; + } + + if (priv->buffering_timeout_id) + { + g_source_remove (priv->buffering_timeout_id); + priv->buffering_timeout_id = 0; + } + + if (priv->download_buffering_element) + { + g_object_unref (priv->download_buffering_element); + priv->download_buffering_element = NULL; + } + + gst_element_set_state (priv->pipeline, GST_STATE_NULL); if (priv->bus) { @@ -2033,6 +2055,7 @@ clutter_gst_player_deinit (ClutterGstPlayer *player) g_free (priv->uri); g_free (priv->font_name); + g_free (priv->user_agent); free_tags_list (&priv->audio_streams); free_tags_list (&priv->subtitle_tracks); diff --git a/clutter-gst/clutter-gst-video-texture.c b/clutter-gst/clutter-gst-video-texture.c index e086072..a5e7e79 100644 --- a/clutter-gst/clutter-gst-video-texture.c +++ b/clutter-gst/clutter-gst-video-texture.c @@ -406,6 +406,16 @@ clutter_gst_video_texture_paint (ClutterActor *actor) */ static void +clutter_gst_video_texture_dispose (GObject *object) +{ + ClutterGstVideoTexture *self = CLUTTER_GST_VIDEO_TEXTURE (object); + + clutter_gst_player_deinit (CLUTTER_GST_PLAYER (self)); + + G_OBJECT_CLASS (clutter_gst_video_texture_parent_class)->dispose (object); +} + +static void clutter_gst_video_texture_finalize (GObject *object) { ClutterGstVideoTexture *self; @@ -414,8 +424,6 @@ 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); @@ -475,6 +483,7 @@ clutter_gst_video_texture_class_init (ClutterGstVideoTextureClass *klass) g_type_class_add_private (klass, sizeof (ClutterGstVideoTexturePrivate)); + object_class->dispose = clutter_gst_video_texture_dispose; object_class->finalize = clutter_gst_video_texture_finalize; object_class->set_property = clutter_gst_video_texture_set_property; object_class->get_property = clutter_gst_video_texture_get_property; |