[clutter-gst] video-texture: Fix a circular dependency not breaking on unref()



commit 9f9ad6266c9e7cd870c86c8d5a346f9912cdad42
Author: Damien Lespiau <damien lespiau intel com>
Date:   Thu Oct 27 19:18:34 2011 +0100

    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
@@ -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;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]