systemclock: Use g_get_real_time on Windows and macOS for realtime clock
authortyler-aicradle <tyler@safex.ai>
Wed, 26 May 2021 19:55:55 +0000 (14:55 -0500)
committertyler-aicradle <tyler@safex.ai>
Thu, 27 May 2021 14:25:29 +0000 (09:25 -0500)
These targets previously were unable to produce wall clock times when
using GstSystemClock, this change makes it possible.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/829>

gst/gstsystemclock.c

index 531819c..3331fe3 100644 (file)
@@ -826,28 +826,39 @@ static GstClockTime
 gst_system_clock_get_internal_time (GstClock * clock)
 {
   GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+#if defined __APPLE__ || defined G_OS_WIN32
+  if (sysclock->priv->clock_type == GST_CLOCK_TYPE_REALTIME) {
+    gint64 rt_micros = g_get_real_time ();
+    // g_get_real_time returns microseconds but we need nanos, so we'll multiply by 1000
+    return ((guint64) rt_micros) * 1000;
+  } else
+#endif
 #if defined __APPLE__
-  uint64_t mach_t = mach_absolute_time ();
-  return gst_util_uint64_scale (mach_t, sysclock->priv->mach_timebase.numer,
-      sysclock->priv->mach_timebase.denom);
-#elif G_OS_WIN32
-  if (sysclock->priv->frequency.QuadPart != 0) {
-    LARGE_INTEGER now;
-
-    /* we prefer the highly accurate performance counters on windows */
-    QueryPerformanceCounter (&now);
-
-    return gst_util_uint64_scale (now.QuadPart,
-        GST_SECOND, sysclock->priv->frequency.QuadPart);
-  } else {
-    gint64 monotime;
+  {
+    uint64_t mach_t = mach_absolute_time ();
+    return gst_util_uint64_scale (mach_t, sysclock->priv->mach_timebase.numer,
+        sysclock->priv->mach_timebase.denom);
+  }
+#elif defined G_OS_WIN32
+  {
+    if (sysclock->priv->frequency.QuadPart != 0) {
+      LARGE_INTEGER now;
 
-    monotime = g_get_monotonic_time ();
+      /* we prefer the highly accurate performance counters on windows */
+      QueryPerformanceCounter (&now);
 
-    return monotime * 1000;
+      return gst_util_uint64_scale (now.QuadPart,
+          GST_SECOND, sysclock->priv->frequency.QuadPart);
+    } else {
+      gint64 monotime;
+
+      monotime = g_get_monotonic_time ();
+
+      return monotime * 1000;
+    }
   }
 #elif defined HAVE_POSIX_TIMERS && defined HAVE_CLOCK_GETTIME
-  clockid_t ptype;
+    clockid_t ptype;
   struct timespec ts;
 
   ptype = clock_type_to_posix_id (sysclock->priv->clock_type);
@@ -863,17 +874,27 @@ static guint64
 gst_system_clock_get_resolution (GstClock * clock)
 {
   GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
-#if defined __APPLE__
-  return gst_util_uint64_scale (GST_NSECOND,
-      sysclock->priv->mach_timebase.numer, sysclock->priv->mach_timebase.denom);
-#elif G_OS_WIN32
-  if (sysclock->priv->frequency.QuadPart != 0) {
-    return GST_SECOND / sysclock->priv->frequency.QuadPart;
-  } else {
+#if defined __APPLE__ || defined G_OS_WIN32
+  if (sysclock->priv->clock_type == GST_CLOCK_TYPE_REALTIME) {
     return 1 * GST_USECOND;
+  } else
+#endif
+#if defined __APPLE__
+  {
+    return gst_util_uint64_scale (GST_NSECOND,
+        sysclock->priv->mach_timebase.numer,
+        sysclock->priv->mach_timebase.denom);
+  }
+#elif defined G_OS_WIN32
+  {
+    if (sysclock->priv->frequency.QuadPart != 0) {
+      return GST_SECOND / sysclock->priv->frequency.QuadPart;
+    } else {
+      return 1 * GST_USECOND;
+    }
   }
 #elif defined(HAVE_POSIX_TIMERS) && defined(HAVE_CLOCK_GETTIME)
-  clockid_t ptype;
+    clockid_t ptype;
   struct timespec ts;
 
   ptype = clock_type_to_posix_id (sysclock->priv->clock_type);
@@ -883,7 +904,7 @@ gst_system_clock_get_resolution (GstClock * clock)
 
   return GST_TIMESPEC_TO_TIME (ts);
 #else
-  return 1 * GST_USECOND;
+    return 1 * GST_USECOND;
 #endif /* __APPLE__ */
 }