[WTF] Add a multiplication operator (and a few others) to MediaTime
[WebKit-https.git] / Source / WTF / wtf / MediaTime.cpp
index ce58bc2e137c028b9f3d1697b51fc7c6f352f889..5821123275131139821922351c56e43b87865c87 100644 (file)
 
 #include <algorithm>
 #include <wtf/CheckedArithmetic.h>
-
-#if PLATFORM(WIN)
-// Work around Visual Studio 2008's lack of an isinf or signbit method in STL.
-namespace std {
-    static bool isinf(double number) { return !_finite(number) && !_isnan(number); }
-    static int signbit(double number) { return number < 0; }
-}
-#endif
+#include <wtf/MathExtras.h>
 
 using namespace std;
 
@@ -61,6 +54,11 @@ static int32_t leastCommonMultiple(int32_t a, int32_t b, int32_t &result)
     return safeMultiply(a, b / greatestCommonDivisor(a, b), result);
 }
 
+static int32_t signum(int64_t val)
+{
+    return (0 < val) - (val < 0);
+}
+
 const int32_t MediaTime::MaximumTimeScale = 0x7fffffffL;
 
 MediaTime::MediaTime()
@@ -222,6 +220,40 @@ MediaTime MediaTime::operator-(const MediaTime& rhs) const
     return a;
 }
 
+MediaTime MediaTime::operator*(int32_t rhs) const
+{
+    if (isInvalid())
+        return invalidTime();
+
+    if (isIndefinite())
+        return indefiniteTime();
+
+    if (!rhs)
+        return zeroTime();
+
+    if (isPositiveInfinite()) {
+        if (rhs > 0)
+            return positiveInfiniteTime();
+        return negativeInfiniteTime();
+    }
+
+    if (isNegativeInfinite()) {
+        if (rhs > 0)
+            return negativeInfiniteTime();
+        return positiveInfiniteTime();
+    }
+
+    MediaTime a = *this;
+
+    while (!safeMultiply(a.m_timeValue, rhs, a.m_timeValue)) {
+        if (a.m_timeScale == 1)
+            return signum(a.m_timeValue) == signum(rhs) ? positiveInfiniteTime() : negativeInfiniteTime();
+        a.setTimeScale(a.m_timeScale / 2);
+    }
+
+    return a;
+}
+
 bool MediaTime::operator<(const MediaTime& rhs) const
 {
     return compare(rhs) == LessThan;
@@ -232,6 +264,11 @@ bool MediaTime::operator>(const MediaTime& rhs) const
     return compare(rhs) == GreaterThan;
 }
 
+bool MediaTime::operator!=(const MediaTime& rhs) const
+{
+    return compare(rhs) != EqualTo;
+}
+
 bool MediaTime::operator==(const MediaTime& rhs) const
 {
     return compare(rhs) == EqualTo;
@@ -339,11 +376,6 @@ void MediaTime::setTimeScale(int32_t timeScale)
     m_timeScale = timeScale;
 }
 
-static int32_t signum(int64_t val)
-{
-    return (0 < val) - (val < 0);
-}
-
 MediaTime abs(const MediaTime& rhs)
 {
     if (rhs.isInvalid())