summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2011-10-27 19:18:34 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2011-10-28 12:03:32 +0100
commitf4039d9cca39b46ff3a054cf8fee8994a7ebeb56 (patch)
treefe20f235f4b664cc92159d3a738ba092f107e385
parent6d7b3fd2d000a013d466e6d087653ab6cc0ab92f (diff)
downloadclutter-gst-f4039d9cca39b46ff3a054cf8fee8994a7ebeb56.tar.gz
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. (cherry picked from commit 9f9ad6266c9e7cd870c86c8d5a346f9912cdad42)
-rw-r--r--clutter-gst/clutter-gst-player.c27
-rw-r--r--clutter-gst/clutter-gst-video-texture.c13
2 files changed, 36 insertions, 4 deletions
diff --git a/clutter-gst/clutter-gst-player.c b/clutter-gst/clutter-gst-player.c
index 9f4ecf5..fc34f0a 100644
--- a/clutter-gst/clutter-gst-player.c
+++ b/clutter-gst/clutter-gst-player.c
@@ -2000,8 +2000,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)
{
@@ -2017,6 +2039,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;