basesink: Only reinit the cached GstClockID if it is for the same clock
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 20 May 2011 11:03:51 +0000 (13:03 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 20 May 2011 11:05:04 +0000 (13:05 +0200)
The clock might have changed since the clock ID was created and in
that case we have to request a new one.

libs/gst/base/gstbasesink.c

index 7740a77..c342d3c 100644 (file)
@@ -2186,14 +2186,21 @@ gst_base_sink_wait_clock (GstBaseSink * sink, GstClockTime time,
   time += base_time;
 
   /* Re-use existing clockid if available */
-  if (G_LIKELY (sink->priv->cached_clock_id != NULL)) {
+  /* FIXME: Casting to GstClockEntry only works because the types
+   * are the same */
+  if (G_LIKELY (sink->priv->cached_clock_id != NULL
+          && GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->
+              priv->cached_clock_id) == clock)) {
     if (!gst_clock_single_shot_id_reinit (clock, sink->priv->cached_clock_id,
             time)) {
       gst_clock_id_unref (sink->priv->cached_clock_id);
       sink->priv->cached_clock_id = gst_clock_new_single_shot_id (clock, time);
     }
-  } else
+  } else {
+    if (sink->priv->cached_clock_id != NULL)
+      gst_clock_id_unref (sink->priv->cached_clock_id);
     sink->priv->cached_clock_id = gst_clock_new_single_shot_id (clock, time);
+  }
   GST_OBJECT_UNLOCK (sink);
 
   /* A blocking wait is performed on the clock. We save the ClockID