gst/playback/: Work around refcount problem with g_value_set_object() that occur...
authorTim-Philipp Müller <tim@centricular.net>
Wed, 7 Dec 2005 18:51:35 +0000 (18:51 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Wed, 7 Dec 2005 18:51:35 +0000 (18:51 +0000)
Original commit message from CVS:
* gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_property):
* gst/playback/gstplaybin.c: (gst_play_bin_get_property):
Work around refcount problem with g_value_set_object() that occur
if the core has been compiled against GLib-2.6 (g_value_set_object()
will only g_object_ref() the element, but the caller will
gst_object_unref() it and bad things will happen due to the way
GstObjects are refcounted in the GLib-2.6 case). Fixes problems with
totem for people on FC4 using Thomas's 0.10 RPMs.

ChangeLog
gst/playback/gstplaybasebin.c
gst/playback/gstplaybin.c

index 2a410b7c7bec6c54d0c1d9acdfbf85dd1209f8cb..e03fccb68d8f279766661555781deac6964e4f42 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-12-07  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_property):
+       * gst/playback/gstplaybin.c: (gst_play_bin_get_property):
+         Work around refcount problem with g_value_set_object() that occur
+         if the core has been compiled against GLib-2.6 (g_value_set_object()
+         will only g_object_ref() the element, but the caller will
+         gst_object_unref() it and bad things will happen due to the way
+         GstObjects are refcounted in the GLib-2.6 case). Fixes problems with
+         totem for people on FC4 using Thomas's 0.10 RPMs.
+         
 2005-12-07  Edward Hervey  <edward@fluendo.com>
 
        Time to welcome ogm to 0.10 :)
index f1c431f0ea93b8f4d5fc00424c265fe26cff5a23..b5fbd7e2b63379f21e245946a84b38d0c9e494ec 100644 (file)
@@ -38,6 +38,16 @@ GST_DEBUG_CATEGORY_STATIC (gst_play_base_bin_debug);
 #define GROUP_WAIT(pbb) g_cond_wait (pbb->group_cond, pbb->group_lock)
 #define GROUP_SIGNAL(pbb) g_cond_signal (pbb->group_cond)
 
+#ifndef GST_HAVE_GLIB_2_8
+#define _gst_gvalue_set_gstobject(gvalue,obj)  \
+      gst_object_ref (obj);                     \
+      g_value_set_object (gvalue, obj);         \
+      g_object_unref (obj);
+#else
+#define _gst_gvalue_set_gstobject(gvalue,obj)  \
+      g_value_set_object (gvalue, obj);
+#endif
+
 /* props */
 enum
 {
@@ -1671,7 +1681,7 @@ gst_play_base_bin_get_property (GObject * object, guint prop_id, GValue * value,
           (gpointer) gst_play_base_bin_get_streaminfo (play_base_bin));
       break;
     case ARG_SOURCE:
-      g_value_set_object (value, play_base_bin->source);
+      _gst_gvalue_set_gstobject (value, play_base_bin->source);
       break;
     case ARG_VIDEO:
       GROUP_LOCK (play_base_bin);
index 7808f81d844ed7c28168f57a25ce9f93ab712ffb..10de1a5df0ad3088d1ec8ee69120cbad1e81b116 100644 (file)
@@ -39,6 +39,16 @@ GST_DEBUG_CATEGORY_STATIC (gst_play_bin_debug);
 
 #define VOLUME_MAX_DOUBLE 4.0
 
+#ifndef GST_HAVE_GLIB_2_8
+#define _gst_gvalue_set_gstobject(gvalue,obj)  \
+      gst_object_ref (obj);                     \
+      g_value_set_object (gvalue, obj);         \
+      g_object_unref (obj);
+#else
+#define _gst_gvalue_set_gstobject(gvalue,obj)  \
+      g_value_set_object (gvalue, obj);
+#endif
+
 typedef struct _GstPlayBin GstPlayBin;
 typedef struct _GstPlayBinClass GstPlayBinClass;
 
@@ -330,13 +340,13 @@ gst_play_bin_get_property (GObject * object, guint prop_id, GValue * value,
 
   switch (prop_id) {
     case ARG_VIDEO_SINK:
-      g_value_set_object (value, play_bin->video_sink);
+      _gst_gvalue_set_gstobject (value, play_bin->video_sink);
       break;
     case ARG_AUDIO_SINK:
-      g_value_set_object (value, play_bin->audio_sink);
+      _gst_gvalue_set_gstobject (value, play_bin->audio_sink);
       break;
     case ARG_VIS_PLUGIN:
-      g_value_set_object (value, play_bin->visualisation);
+      _gst_gvalue_set_gstobject (value, play_bin->visualisation);
       break;
     case ARG_VOLUME:
       g_value_set_double (value, play_bin->volume);