From 9f9ad6266c9e7cd870c86c8d5a346f9912cdad42 Mon Sep 17 00:00:00 2001 From: Damien Lespiau Date: Thu, 27 Oct 2011 19:18:34 +0100 Subject: 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. --- clutter-gst/clutter-gst-player.c | 27 +++++++++++++++++++++++++-- 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 @@ -405,6 +405,16 @@ clutter_gst_video_texture_paint (ClutterActor *actor) * GObject implementation */ +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) { @@ -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; -- cgit v1.2.1