From fd280c09819d3f0685317499877791a0dd5369d2 Mon Sep 17 00:00:00 2001 From: Roman Shpuntov Date: Thu, 18 Jun 2020 15:52:40 +0700 Subject: [PATCH] systemclock: Fix clock time conversion on Windows/xbox The returned ratio can be bigger than GST_SECOND, in which case we would forever return 0 for the system clock time. Even in other cases if it's close to GST_SECOND it would result in accuracy loss. Instead of doing the division by GST_CLOCK_TIME_NONE during initialization once, do it every time the clock time is requested. Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/575 Part-of: --- gst/gstsystemclock.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c index 91e4078..96341fd 100644 --- a/gst/gstsystemclock.c +++ b/gst/gstsystemclock.c @@ -352,7 +352,6 @@ struct _GstSystemClockPrivate #ifdef G_OS_WIN32 LARGE_INTEGER frequency; - guint64 ratio; #endif /* G_OS_WIN32 */ #ifdef __APPLE__ struct mach_timebase_info mach_timebase; @@ -453,10 +452,6 @@ gst_system_clock_init (GstSystemClock * clock) #ifdef G_OS_WIN32 QueryPerformanceFrequency (&priv->frequency); - /* can be 0 if the hardware does not have hardware support */ - if (priv->frequency.QuadPart != 0) { - priv->ratio = GST_SECOND / priv->frequency.QuadPart; - } #endif /* G_OS_WIN32 */ #ifdef __APPLE__ @@ -845,7 +840,8 @@ gst_system_clock_get_internal_time (GstClock * clock) /* we prefer the highly accurate performance counters on windows */ QueryPerformanceCounter (&now); - return now.QuadPart * sysclock->priv->ratio; + return gst_util_uint64_scale (now.QuadPart, + GST_SECOND, sysclock->priv->frequency.QuadPart); } else #endif /* G_OS_WIN32 */ #if !defined HAVE_POSIX_TIMERS || !defined HAVE_CLOCK_GETTIME -- 2.7.4