diff --git a/gst/gstobject.c b/gst/gstobject.c index 6de04bf965..7fb25425c3 100644 --- a/gst/gstobject.c +++ b/gst/gstobject.c @@ -180,8 +180,10 @@ gst_object_ref (GstObject *object) { g_return_val_if_fail (GST_IS_OBJECT (object), NULL); - GST_DEBUG (GST_CAT_REFCOUNTING, "ref '%s' %d->%d",GST_OBJECT_NAME(object), - G_OBJECT(object)->ref_count,G_OBJECT(object)->ref_count+1); + GST_DEBUG (GST_CAT_REFCOUNTING, "ref %p '%s' %d->%d", object, + GST_OBJECT_NAME (object), + G_OBJECT (object)->ref_count, + G_OBJECT (object)->ref_count + 1); g_object_ref (G_OBJECT (object)); return object; @@ -199,8 +201,10 @@ gst_object_unref (GstObject *object) { g_return_if_fail (GST_IS_OBJECT (object)); - GST_DEBUG (GST_CAT_REFCOUNTING, "unref '%s' %d->%d",GST_OBJECT_NAME(object), - G_OBJECT(object)->ref_count,G_OBJECT(object)->ref_count-1); + GST_DEBUG (GST_CAT_REFCOUNTING, "unref %p '%s' %d->%d", object, + GST_OBJECT_NAME (object), + G_OBJECT (object)->ref_count, + G_OBJECT (object)->ref_count - 1); g_object_unref (G_OBJECT (object)); } @@ -220,9 +224,9 @@ gst_object_sink (GstObject *object) g_return_if_fail (object != NULL); g_return_if_fail (GST_IS_OBJECT (object)); - GST_DEBUG (GST_CAT_REFCOUNTING, "sink '%s'",GST_OBJECT_NAME(object)); - if (GST_OBJECT_FLOATING (object)) - { + GST_DEBUG (GST_CAT_REFCOUNTING, "sink %p '%s'", object, GST_OBJECT_NAME (object)); + + if (GST_OBJECT_FLOATING (object)) { GST_FLAG_UNSET (object, GST_FLOATING); gst_object_unref (object); } @@ -262,7 +266,8 @@ gst_object_destroy (GstObject *object) g_return_if_fail (object != NULL); g_return_if_fail (GST_IS_OBJECT (object)); - GST_DEBUG (GST_CAT_REFCOUNTING, "destroy '%s'",GST_OBJECT_NAME(object)); + GST_DEBUG (GST_CAT_REFCOUNTING, "destroy %p '%s'", object, GST_OBJECT_NAME (object)); + if (!GST_OBJECT_DESTROYED (object)) { /* need to hold a reference count around all class method @@ -275,7 +280,8 @@ gst_object_destroy (GstObject *object) static void gst_object_dispose (GObject *object) { - GST_DEBUG (GST_CAT_REFCOUNTING, "dispose '%s'",GST_OBJECT_NAME(object)); + GST_DEBUG (GST_CAT_REFCOUNTING, "dispose %p '%s'", object, GST_OBJECT_NAME (object)); + GST_FLAG_SET (GST_OBJECT (object), GST_DESTROYED); GST_OBJECT_PARENT (object) = NULL; @@ -288,7 +294,7 @@ gst_object_finalize (GObject *object) { GstObject *gstobject = GST_OBJECT (object); - GST_DEBUG (GST_CAT_REFCOUNTING, "finalize '%s'",GST_OBJECT_NAME(object)); + GST_DEBUG (GST_CAT_REFCOUNTING, "finalize %p '%s'", object, GST_OBJECT_NAME (object)); g_signal_handlers_destroy (object); diff --git a/gst/gstscheduler.c b/gst/gstscheduler.c index 0436e54491..e160165a4d 100644 --- a/gst/gstscheduler.c +++ b/gst/gstscheduler.c @@ -29,6 +29,7 @@ static void gst_scheduler_class_init (GstSchedulerClass *klass); static void gst_scheduler_init (GstScheduler *sched); +static void gst_scheduler_dispose (GObject *object); static GstObjectClass *parent_class = NULL; @@ -62,7 +63,13 @@ gst_scheduler_get_type (void) static void gst_scheduler_class_init (GstSchedulerClass *klass) { + GObjectClass *gobject_class; + + gobject_class = (GObjectClass*) klass; + parent_class = g_type_class_ref (GST_TYPE_OBJECT); + + gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_scheduler_dispose); } static void @@ -77,6 +84,17 @@ gst_scheduler_init (GstScheduler *sched) sched->clock = NULL; } +static void +gst_scheduler_dispose (GObject *object) +{ + GstScheduler *sched = GST_SCHEDULER (object); + + gst_object_swap ((GstObject **)&sched->current_clock, NULL); + gst_object_swap ((GstObject **)&sched->clock, NULL); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + /** * gst_scheduler_setup: * @sched: the scheduler @@ -274,7 +292,6 @@ gst_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint t g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE); if (element == sched->parent && sched->parent_sched == NULL) { - switch (transition) { case GST_STATE_READY_TO_PAUSED: { @@ -286,7 +303,7 @@ gst_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint t GST_DEBUG (GST_CAT_CLOCK, "scheduler READY to PAUSED clock is %p (%s)", clock, (clock ? GST_OBJECT_NAME (clock) : "nil")); - sched->current_clock = clock; + gst_object_swap ((GstObject **)&sched->current_clock, (GstObject *)clock); break; } case GST_STATE_PAUSED_TO_PLAYING: @@ -296,7 +313,7 @@ gst_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint t GST_DEBUG (GST_CAT_CLOCK, "scheduler PAUSED to PLAYING clock is %p (%s)", clock, (clock ? GST_OBJECT_NAME (clock) : "nil")); - sched->current_clock = clock; + gst_object_swap ((GstObject **)&sched->current_clock, (GstObject *)clock); gst_scheduler_set_clock (sched, sched->current_clock); if (sched->current_clock) { @@ -577,7 +594,8 @@ gst_scheduler_use_clock (GstScheduler *sched, GstClock *clock) g_return_if_fail (GST_IS_SCHEDULER (sched)); GST_FLAG_SET (sched, GST_SCHEDULER_FLAG_FIXED_CLOCK); - sched->clock = clock; + + gst_object_swap ((GstObject **)&sched->clock, (GstObject *)clock); GST_DEBUG (GST_CAT_CLOCK, "scheduler using fixed clock %p (%s)", clock, (clock ? GST_OBJECT_NAME (clock) : "nil")); @@ -603,7 +621,7 @@ gst_scheduler_set_clock (GstScheduler *sched, GstClock *clock) receivers = sched->clock_receivers; schedulers = sched->schedulers; - sched->current_clock = clock; + gst_object_swap ((GstObject **)&sched->current_clock, (GstObject *)clock); while (receivers) { GstElement *element = GST_ELEMENT (receivers->data); @@ -637,7 +655,8 @@ gst_scheduler_auto_clock (GstScheduler *sched) g_return_if_fail (GST_IS_SCHEDULER (sched)); GST_FLAG_UNSET (sched, GST_SCHEDULER_FLAG_FIXED_CLOCK); - sched->clock = NULL; + + gst_object_swap ((GstObject **)&sched->clock, NULL); GST_DEBUG (GST_CAT_CLOCK, "scheduler using automatic clock"); } @@ -789,14 +808,16 @@ gst_scheduler_factory_new (const gchar *name, const gchar *longdesc, GType type) GstSchedulerFactory *factory; g_return_val_if_fail(name != NULL, NULL); + factory = gst_scheduler_factory_find (name); + if (!factory) { factory = GST_SCHEDULER_FACTORY (g_object_new (GST_TYPE_SCHEDULER_FACTORY, NULL)); } - - GST_PLUGIN_FEATURE_NAME (factory) = g_strdup (name); - if (factory->longdesc) + else { g_free (factory->longdesc); + } + factory->longdesc = g_strdup (longdesc); factory->type = type; @@ -835,6 +856,7 @@ gst_scheduler_factory_find (const gchar *name) GST_DEBUG (0,"gstscheduler: find \"%s\"", name); feature = gst_registry_pool_find_feature (name, GST_TYPE_SCHEDULER_FACTORY); + if (feature) return GST_SCHEDULER_FACTORY (feature); @@ -920,8 +942,7 @@ gst_scheduler_factory_make (const gchar *name, GstElement *parent) void gst_scheduler_factory_set_default_name (const gchar* name) { - if (_default_name) - g_free (_default_name); + g_free (_default_name); _default_name = g_strdup (name); } diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c index 0297f57482..42dd6b36de 100644 --- a/gst/gstsystemclock.c +++ b/gst/gstsystemclock.c @@ -109,6 +109,9 @@ gst_system_clock_obtain (void) _the_system_clock = GST_CLOCK (g_object_new (GST_TYPE_SYSTEM_CLOCK, NULL)); gst_object_set_name (GST_OBJECT (_the_system_clock), "GstSystemClock"); + + gst_object_ref (GST_OBJECT (_the_system_clock)); + gst_object_sink (GST_OBJECT (_the_system_clock)); } return _the_system_clock; }