rtsprange: Avoid going through fractions for large numbers
authorOlivier CrĂȘte <olivier.crete@collabora.com>
Fri, 22 Feb 2013 18:20:21 +0000 (13:20 -0500)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 11 Mar 2013 09:41:17 +0000 (10:41 +0100)
If the number of seconds exceeds 2^31, then it will be truncated if the
conversion is done using fractions, so multiply it directly.

gst-libs/gst/rtsp/gstrtsprange.c

index f19e7a9..94f3c01 100644 (file)
@@ -439,11 +439,17 @@ gst_rtsp_range_free (GstRTSPTimeRange * range)
 static GstClockTime
 get_seconds (const GstRTSPTime * t)
 {
-  gint num, denom;
-  /* don't do direct multiply with GST_SECOND to avoid rounding
-   * errors */
-  gst_util_double_to_fraction (t->seconds, &num, &denom);
-  return gst_util_uint64_scale_int (GST_SECOND, num, denom);
+  if (t->seconds < G_MAXINT) {
+    gint num, denom;
+    /* Don't do direct multiply with GST_SECOND to avoid rounding
+     * errors.
+     * This only works for "small" numbers, because num is limited to 32-bit
+     */
+    gst_util_double_to_fraction (t->seconds, &num, &denom);
+    return gst_util_uint64_scale_int (GST_SECOND, num, denom);
+  } else {
+    return t->seconds * GST_SECOND;
+  }
 }
 
 static GstClockTime